{"id":21995351,"url":"https://github.com/polymerlabs/books","last_synced_at":"2025-07-08T20:09:48.541Z","repository":{"id":66263305,"uuid":"124119459","full_name":"PolymerLabs/books","owner":"PolymerLabs","description":null,"archived":false,"fork":false,"pushed_at":"2025-03-28T22:16:07.000Z","size":3200,"stargazers_count":54,"open_issues_count":13,"forks_count":34,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-03-31T06:06:03.298Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://books-pwakit.appspot.com","language":"JavaScript","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/PolymerLabs.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,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-03-06T18:14:59.000Z","updated_at":"2023-08-14T14:45:22.000Z","dependencies_parsed_at":"2024-12-27T10:06:21.610Z","dependency_job_id":null,"html_url":"https://github.com/PolymerLabs/books","commit_stats":{"total_commits":53,"total_committers":6,"mean_commits":8.833333333333334,"dds":0.1132075471698113,"last_synced_commit":"c98ec64f30d3965a7efb1e1ee57dabd243c6b4b4"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PolymerLabs%2Fbooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PolymerLabs%2Fbooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PolymerLabs%2Fbooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PolymerLabs%2Fbooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PolymerLabs","download_url":"https://codeload.github.com/PolymerLabs/books/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247608160,"owners_count":20965953,"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":[],"created_at":"2024-11-29T21:14:24.061Z","updated_at":"2025-04-07T07:17:43.156Z","avatar_url":"https://github.com/PolymerLabs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Built with pwa–starter–kit](https://img.shields.io/badge/built_with-pwa–starter–kit_-blue.svg)](https://github.com/Polymer/pwa-starter-kit \"Built with pwa–starter–kit\")\n\n# Books PWA\n\nBooks is a simple Google Books PWA. It uses [Google Books API](https://developers.google.com/books/docs/v1/reference/volumes/list) to search for books and [Embedded Viewer API](https://developers.google.com/books/docs/viewer/reference) to display book content.\n\nAdditionally it uses [OAuth 2.0](https://developers.google.com/identity/protocols/OAuth2UserAgent) authorization to retrieve a listing of the Favorites on the authenticated user's bookshelf. As well as add/remove favorite on the authenticated user's bookshelf.\n\nThe app is built using [PWA Starter Kit](https://github.com/Polymer/pwa-starter-kit). Using the starter-template as the starting point and the [wiki](https://github.com/Polymer/pwa-starter-kit/wiki) for configuring and personalizing.\n\n![books screenshot](https://user-images.githubusercontent.com/116360/39160803-4d7a2696-4722-11e8-9ca2-d9b4dd1ac8f5.png)\n\n## Features/highlights\n\n- Show a basic search-list-detail flow.\n- Use `fetch` to send request to Google Books API.\n- Sign-in to Google account using [Google Sign-In Client API](https://developers.google.com/identity/sign-in/web/reference#googleauthsignin)\n- OAuth 2.0 authorization to access Google APIs via [Google API Client Library](https://developers.google.com/api-client-library/javascript/reference/referencedocs)\n- Display offline UI when fetch returns failure while offline.\n- And once it comes back online, automatically re-fetch and update the page.\n- Uses the [SpeechRecognition API](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition) to search by voice.\n- Shimmer placeholder while content is loading.  \n    ![shimmer](https://user-images.githubusercontent.com/116360/38531318-1ec79c38-3c24-11e8-8e8f-d2efdf190afa.gif)\n- Update the browser URL programmatically without causing page reload. In the app, we want to append query param to the URL when the search input’s value is committed.\n- Scroll to top on page change.\n- `\u003cbook-rating\u003e`: Simple rating element.\n- `\u003cbook-image\u003e`: Basic image element which fades in when the image is loaded. Also has a placeholder that can be used to put a base64 encoded data URL to create the “blur up” effect.\n- `\u003cbook-input-decorator\u003e`: Simple input decorator element in which the input's underline animates when the input is focused.\n\n## Setup\n```bash\n$ npm i\n$ npm start # or similar that serve index.html for all routes\n```\n\n#### Enable OAuth for list/add/remove favorites on the authenticated user's bookshelf\n- Enable Books API and create OAuth client ID  \nhttps://developers.google.com/identity/protocols/OAuth2UserAgent#prerequisites\n- Set the OAuth client ID in the application [here](https://github.com/PolymerLabs/books/blob/master/src/actions/auth.js#L24)\n\n## Build and deploy\n```bash\n$ npm run build:prpl-server\n```\nDownload the [Google App Engine SDK](https://cloud.google.com/appengine/downloads) and follow the instructions to install and create a new project. This app uses the Python SDK.\n```bash\n$ gcloud app deploy server/app.yaml --project \u003cproject\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpolymerlabs%2Fbooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpolymerlabs%2Fbooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpolymerlabs%2Fbooks/lists"}