{"id":24946463,"url":"https://github.com/logifex/buylist","last_synced_at":"2026-04-09T13:49:02.614Z","repository":{"id":275473032,"uuid":"926029738","full_name":"logifex/Buylist","owner":"logifex","description":"A collaborative shopping list app made with React, Express, PostgreSQL, Socket.IO and React Native and Expo for mobile.","archived":false,"fork":false,"pushed_at":"2025-03-28T11:40:43.000Z","size":822,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-28T12:32:36.824Z","etag":null,"topics":["expo","express","nodejs","postgresql","react","react-native","shopping-list","socket-io","tailwindcss"],"latest_commit_sha":null,"homepage":"https://buylistapp.web.app","language":"TypeScript","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/logifex.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":"2025-02-02T11:29:34.000Z","updated_at":"2025-03-28T11:40:47.000Z","dependencies_parsed_at":"2025-02-02T19:31:43.169Z","dependency_job_id":"ef82ed55-9185-4cf7-b199-3c8ac9e12383","html_url":"https://github.com/logifex/Buylist","commit_stats":null,"previous_names":["logifex/buylist"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logifex%2FBuylist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logifex%2FBuylist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logifex%2FBuylist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logifex%2FBuylist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/logifex","download_url":"https://codeload.github.com/logifex/Buylist/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246085641,"owners_count":20721212,"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":["expo","express","nodejs","postgresql","react","react-native","shopping-list","socket-io","tailwindcss"],"created_at":"2025-02-02T20:56:24.366Z","updated_at":"2025-12-30T19:03:41.592Z","avatar_url":"https://github.com/logifex.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Buylist\n\nA collaborative shopping list app that allows users to create and share lists with others in real time. Available on both web and mobile, the app supports offline functionality, list customization, and Google authentication.\n\n## Features\n\n### General\n- Create, edit, and delete shopping lists.\n- Customize lists with different colors.\n- Add, edit, delete, and check/uncheck products.\n- Prevent duplicate products, with an option to add anyway or uncheck an existing item.\n- Invite others to collaborate using an invite link (expires after 3 days).\n- View and manage participants (owner can remove participants).\n- Dark mode and light mode support.\n- Google authentication for secure login.\n- Real-time updates using WebSockets.\n\n### Web Version\n- Built using React, Vite, and TailwindCSS.\n- Uses React Router for navigation.\n\n### Mobile Version\n- Built with Expo and React Native.\n- Uses Expo Router for navigation.\n- Supports offline-first functionality:\n  - View all lists, including shared ones, while offline.\n  - Perform operations like adding, editing, or deleting products, which sync when online.\n- Allows creation of local \"personal\" lists that are not synced with the server.\n- Local lists can be shared and converted into shared lists.\n- Designed for Android (not tested on iOS).\n\n## Try It Out\nBuylist is available on multiple platforms:\n\n- **Web Version:** Access the app from any browser at [Live Website](\u003chttps://buylistapp.web.app\u003e).\n- **Android Version:** Download the app from the [Google Play Store](\u003chttps://play.google.com/store/apps/details?id=com.shalev.shoppinglistmobile\u003e).\n\nThe mobile version includes additional features such as offline support and local lists. Note that the app is currently designed and tested for Android, and iOS support has not been tested.\n\n## Screenshots\n\n### Web Version\n![Home Screen](readme/web/home.jpeg)\n![Dark Mode](readme/web/dark.jpeg)\n![List Screen](readme/web/list.jpeg)\n![Participants Screen](readme/web/participants.jpeg)\n\n### Mobile Version\n\u003cimg src=\"readme/mobile/home.png\" width=300\u003e \u003cimg src=\"readme/mobile/dark.png\" width=300\u003e \u003cimg src=\"readme/mobile/list.png\" width=300\u003e\n\n## Technologies Used\n\n### Clients (Web \u0026 Mobile)\n- **React, React Native, Vite, Expo** (frontend frameworks)\n- **TailwindCSS** (for styling)\n- **TanStack Query** (for API queries and mutations)\n- **TanStack Query Persist** (for offline-first sync on mobile)\n- **Firebase Authentication** (for authentication)\n- **Socket.IO** (for real-time updates)\n- **AsyncStorage** (for local lists on mobile)\n\n### Server\n- **Node.js, Express** (backend framework)\n- **PostgreSQL, Prisma** (database and ORM)\n- **Redis** (for Socket.IO adapter communication between instances)\n- **Morgan, Winston** (for logging)\n- **Zod** (for validation)\n- **Mocha, Chai, Sinon, Supertest** (for testing)\n- **Socket.IO** (for real-time communication)\n\n## Environment Variables\nEach part of the application requires a `.env` file in its root folder.\n\n### Web Client\n```\nVITE_SERVER_URL=\u003cserver_url\u003e\nVITE_FIREBASE_API_KEY=\u003cfirebase_api_key\u003e\nVITE_FIREBASE_AUTH_DOMAIN=\u003cfirebase_auth_domain\u003e\nVITE_FIREBASE_PROJECT_ID=\u003cfirebase_project_id\u003e\nVITE_FIREBASE_MESSAGING_SENDER_ID=\u003cfirebase_messaging_sender_id\u003e\nVITE_FIREBASE_APP_ID=\u003cfirebase_app_id\u003e\n```\n\n### Mobile Client\n```\nEXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID=\u003cgoogle_signin_client_id\u003e\nEXPO_PUBLIC_SERVER_URL=\u003cserver_url\u003e\nGOOGLE_SERVICES_JSON=google-services.json (file required)\nANDROID_PACKAGE=\u003candroid_package_name\u003e\n```\n\n### Server\n```\nNODE_ENV=\u003cdevelopment_or_production\u003e (optional)\nPORT=\u003cserver_port\u003e (optional, default value provided)\nDATABASE_URL=\u003cpostgres_database_url\u003e\nREDIS_URL=\u003credis_url\u003e (optional, default value provided. A Redis database is required)\nGOOGLE_APPLICATION_CREDENTIALS=service-account-file.json (file required)\nCLIENT_URL=\u003cclient_url\u003e (optional, defaults to localhost:5173, used for cors and redirects)\nSERVER_URL=\u003cserver_url\u003e (optional, used for logging)\nGOOGLE_API_KEY=\u003cgoogle_api_key\u003e (optional, required for testing)\n```\n\u003e **Note:** To properly run tests in development, a Firebase Auth Emulator is required along with `GOOGLE_API_KEY`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flogifex%2Fbuylist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flogifex%2Fbuylist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flogifex%2Fbuylist/lists"}