{"id":18314530,"url":"https://github.com/fedellen/list-together","last_synced_at":"2025-08-04T20:09:24.540Z","repository":{"id":43066817,"uuid":"318300261","full_name":"fedellen/list-together","owner":"fedellen","description":"A simple, modern grocery list app","archived":false,"fork":false,"pushed_at":"2024-03-28T22:15:08.000Z","size":3499,"stargazers_count":8,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-04-25T05:06:20.299Z","etag":null,"topics":["apollo","graphql","postgresql","react","tailwindcss","typeorm","typescript"],"latest_commit_sha":null,"homepage":"https://github.com/fedellen/list-together","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fedellen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2020-12-03T19:38:11.000Z","updated_at":"2022-10-03T00:01:43.000Z","dependencies_parsed_at":"2024-01-07T21:49:50.622Z","dependency_job_id":null,"html_url":"https://github.com/fedellen/list-together","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/fedellen%2Flist-together","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedellen%2Flist-together/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedellen%2Flist-together/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedellen%2Flist-together/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fedellen","download_url":"https://codeload.github.com/fedellen/list-together/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223204385,"owners_count":17105777,"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":["apollo","graphql","postgresql","react","tailwindcss","typeorm","typescript"],"created_at":"2024-11-05T16:34:24.798Z","updated_at":"2025-04-05T19:34:49.626Z","avatar_url":"https://github.com/fedellen.png","language":"TypeScript","funding_links":["https://ko-fi.com/pixelpajamastudios"],"categories":[],"sub_categories":[],"readme":"# Fullstack TypeScript React Grocery List App\n\n### **List Together**\n\nList Together is a simple, modern list app built with sharing capabilities. Completely free to use and open source.\n\nhttps://www.listtogether.app\n\n[![Netlify Status](https://api.netlify.com/api/v1/badges/57d60c53-4c34-4cd9-9577-2fd5443a3ea1/deploy-status)](https://app.netlify.com/sites/stoic-benz-88b941/deploys)\n\n## **🚀 Features**\n\n- Create and Manage Lists\n- Add, Strike, and Delete Items\n- Add Notes to Items\n- Share Lists\n- Historical Auto Complete\n- Undo Capabilities\n- Simple oAuth Sign-up / Login\n- Responsive Mobile Design\n- Keyboard Accessibility\n\nUsers can easily create an account by signing in with Google, Twitter, or Facebook. The database's User entity will only store the user's email. This is to be used in sharing lists with other users. No passwords stored, no account information to remember.\n\nLists can be renamed, removed, or shared to other users. Every list contains a history of items added and removed to be used in that list's Auto Complete and Smart Sort features.\n\nUsers with access to a list can add items, strike items, and/or delete items. \n\nMost list actions are stored locally to be used in the `Undo` feature. Users can conveniently undo or redo these actions to revert the list back to their preferred state.\n\nStriking items will immediately sort that item to the bottom on the list. Un-striking will sort the item back into the list. While a list has striked items, users can enter `Review` mode to view only their striked items. While in `Review` mode, users can quickly delete all currently striked items on the list.\n\nUsers can easily share their lists with friends or family via email address. The shared user must have an account already created for server to accept it as a sharable email address. While online, the shared user will receive a notification and the list immediately upon sharing.\n\nOwners of a list can choose to limit the privileges they want that shared user to have. Available Privilege levels include `read`, `add`, `strike`, and `full`. This feature is intended to protect your list from being cleared out accidentally by younger family members or friends but still allowing them access to add items or read the list.\n\nEach user can sort the order the items for their own unique display, without disrupting the order of shared users' sorted items. Items on the list can be sorted manually, or by using the `SmartSort` feature. As the history of your lists grow, `SmartSort` will remember the order in which your items have previously been removed.\n\nBy default, the `SmartSort` option will try to sort your list into the route you take through the store. Alternatively you can save your own order for each item by sorting your list manually then using the `SaveOrder` option located in the `HeaderOptions`.\n\nThis app also features some limited offline functionality. Users can install the app locally as a PWA. When in offline mode, they can view their last available list queries from the cache. Interacting with the lists does not work offline.\n\n## **💽 Backend made with:**\n\n- [TypeORM](https://github.com/typeorm/typeorm)\n- [Postgres](https://github.com/postgres/postgres)\n- [Express](https://github.com/expressjs/session)\n- [Passport](https://github.com/jaredhanson/passport)\n- [Apollo Server](https://github.com/apollographql/apollo-server)\n- [ioRedis](https://github.com/luin/ioredis)\n- [Type-GraphQL](https://github.com/MichalLytek/type-graphql)\n\nThe backend is currently deployed on a Digital Ocean droplet with [Dokku](https://github.com/dokku/dokku).\n\nTo install and test List Together locally, you will first need to setup Postgres and Redis on your system. You will also need to provide a .env file with the appropriate fields filled in, see [.env.example](https://github.com/fedellen/list-together/blob/master/server/.env.example). The current dev environment requires at least one method of logging in via a Passport API (Google / Twitter / Facebook), in which you'll need to create a dummy app for testing. Afterwards, install and run the server in development mode with:\n\n```\ncd ./server \u0026\u0026 yarn \u0026\u0026 yarn dev\n```\n\nWhen making changes to the code in development mode you'll need to open another terminal to the `/server` directory and run:\n\n```\nyarn watch\n```\n\nBefore committing any changes to the backend be sure to test the resolvers by running:\n\n```\nyarn test\n```\n\nI used [Ben Awad's awesome lireddit repository](https://github.com/benawad/lireddit/) as a starting point for the backend and bootstrapped with:\n\n```\ntypeorm init --name list-together --database postgres\n```\n\n## **💻 Frontend made with:**\n\n- [React](https://github.com/facebook/react)\n- [Apollo Client](https://github.com/apollographql/apollo-client)\n- [GraphQL Codegen](https://github.com/dotansimha/graphql-code-generator)\n- [Tailwind](https://github.com/tailwindlabs/tailwindcss)\n- [Workbox](https://github.com/googlechrome/workbox)\n\nAlso a huge thanks for all of the work put into the [React+TypeScript Cheatsheets](https://github.com/typescript-cheatsheets/react)\n\nThe front-end is hosted on Netlify and available at: https://www.listtogether.app\n\nUpdates to the `/web` directory on the master branch will trigger Netlify deployment.\n\nTo install and run the front end locally you will need to run:\n\n```\ncd ./web \u0026\u0026 yarn \u0026\u0026 yarn start\n```\n\nFrontend was bootstrapped with:\n\n```\nnpx create-react-app my-app --template cra-template-pwa-typescript\n```\n\n## **📖 About the project**\n\nList Together is a project I've created to upgrade our personal grocery list routine. I used this opportunity to expand my knowledge of React with TypeScript.\n\nUnderstanding TypeScript was the hardest part of my recent web-dev learning journey. Whenever I encounter something frustrating and difficult, I've always attempted to meet that problem head on. Therefore, I decided to create a full stack application using as much TypeScript as I possibly could.\n\nNow I can absolutely write that TypeScript is no longer difficult or frustrating for me. As expected, I now prefer it over plain JavaScript as it provides much more information and an awesome developer experience. After about a week of using TypeScript regularly it became an very useful tool. There was a certain moment where I stopped struggling against the TypeChecker and started working **with** the TypeChecker.\n\nAfter attempting several different offline-first with Apollo Client methods, I struggled to get offline mutations to work consistently enough to include this feature. Rather than starting over with a stack that includes more robust offline functionality, I decided to finish this app with Apollo and skip the offline mutations for now.\n\n## **💖 Support us**\n\nList Together is free to use and it\u0026rsquo;s code is open source on\nGitHub. Contributions to the project and\nforks are more than welcome. You can support the project or help us pay server costs by tipping us a [Ko-fi](https://ko-fi.com/pixelpajamastudios)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffedellen%2Flist-together","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffedellen%2Flist-together","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffedellen%2Flist-together/lists"}