{"id":18300346,"url":"https://github.com/jpdevries/synctodo","last_synced_at":"2025-09-06T22:42:00.567Z","repository":{"id":140005783,"uuid":"64886477","full_name":"jpdevries/synctodo","owner":"jpdevries","description":"Progressively Enhanced React To Do List","archived":false,"fork":false,"pushed_at":"2017-05-09T15:20:07.000Z","size":148,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-28T23:45:41.193Z","etag":null,"topics":["a11y","express","html5","node","postgres","progressive-enhancement","react","redux","server-side-rendering"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/jpdevries.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,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-08-03T23:35:06.000Z","updated_at":"2019-03-15T14:22:02.000Z","dependencies_parsed_at":"2023-05-01T03:49:24.840Z","dependency_job_id":null,"html_url":"https://github.com/jpdevries/synctodo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jpdevries/synctodo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpdevries%2Fsynctodo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpdevries%2Fsynctodo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpdevries%2Fsynctodo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpdevries%2Fsynctodo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jpdevries","download_url":"https://codeload.github.com/jpdevries/synctodo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpdevries%2Fsynctodo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273973989,"owners_count":25200579,"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","status":"online","status_checked_at":"2025-09-06T02:00:13.247Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["a11y","express","html5","node","postgres","progressive-enhancement","react","redux","server-side-rendering"],"created_at":"2024-11-05T15:12:04.773Z","updated_at":"2025-09-06T22:42:00.540Z","avatar_url":"https://github.com/jpdevries.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Sync To Do\n========\n\nProgressively Enhanced React To\u0026nbsp;Do List. HTML\u0026ndash;first, Node, Express,\u0026nbsp;PostgreSQL.\n\n## Preview\nHave a look at the synchronous and asynchronous endpoints in\u0026nbsp;action. [Run the live demo at our Heroku Dino](https://sleepy-anchorage-68739.herokuapp.com).\n\n![](http://j4p.us/3L3k0i450J3k/todolist.gif)\n\n## What you need\n\nInstall the [grunt-cli](http://gruntjs.com/getting-started#installing-the-cli) package if you haven't before. This should be done as a global install:\n\n```bash\nnpm install -g grunt-cli\n```\n\nMake sure you have `grunt` installed by testing:\n\n```bash\ngrunt --version\n```\n\nTo interact with the application you'll need to be running PostgreSQL for the database. [Install Postgres](https://www.postgresql.org/download/) if you haven't already. Mac users can [install Postgres via brew](https://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/).\n\nCreate a synctodo\u0026nbsp;database.\n\n```\npsql\nCREATE DATABASE synctodo;\n\\q\n```\n\n Next import our example\u0026nbsp;data. Data will be imported into a `tasks`\u0026nbsp;table.\n\n```bash\npsql synctodo \u003c _build/db/synctodo.sql\n```\n\n## Getting Started\nFirst, clone a copy of this git repo by running:\n\n```bash\ngit clone -b grunt git@github.com:jpdevries/synctodo.git\n```\n\nThen cd into the `synctodo` folder and install the Node\u0026nbsp;dependencies:\n```bash\ncd synctodo\nnpm install\n```\n\nYou should now be able to build the files and run the Node\u0026nbsp;server!\n```bash\ngrunt build\nnpm run serve\n```\n\nThe server will automatically restart when changes are made. To watch the Sass source files for changes and automatically rebuild the source files, run the `grunt` command:\n```bash\ngrunt #alias for grunt watch\n```\n\nBy default this project runs on port 1187. To run it on a different port use the `PORT` environmental variable:\n```bash\nPORT=8081 npm run serve #visit http://localhost:8081 in your browser\n```\n\nTo use a database with a different name use the `PGDATABASE` environmental\u0026nbsp;variable:\n\n```bash\nPGDATABASE=anotherdb npm run serve\n```\n\n## Features\n - Add, Complete, Archive, and Delete\u0026nbsp;Tasks\n - Progressive Enhancement (`.no-js`) support\n - Isomorphic HTML layer doubles as a data model for Redux\n - Isomorphic server uses the same promises for asynchronous and synchronous\u0026nbsp;requests\n - React\u0026nbsp;Routing\n - React and Redux used on both server and client\u0026nbsp;side\n - REST API prefetches and fetches data to keep UI\u0026nbsp;fresh\n - Loads dependencies from CDN with local\u0026nbsp;fallback\n - Feature detection to only load scripts if they'll work (IE9+)\n\n### Add New Tasks\nHomepage at `/`  \nAsynchronously posts to `/api/tasks`\n\n![](http://j4p.us/1l1G471R453z/Screen%20Shot%202016-08-06%20at%201.13.46%20AM.png)\n\n### Complete Tasks\nSynchronously posts to `/`  \nAsynchronously posts to `/api/tasks`\n\n![](http://j4p.us/3K3C3R1o3a1b/Screen%20Shot%202016-08-06%20at%201.14.11%20AM.png)\n\n### Archive Tasks\nSynchronously posts to `/archive`  \nAsynchronously posts to `/api/tasks`\n\n![](http://j4p.us/162W063Y3i0K/Screen%20Shot%202016-08-06%20at%201.14.23%20AM.png)\n\n### Unarchive Tasks\nSynchronously posts to `/`  \nAsynchronously posts to `/api/tasks`\n\n![](http://j4p.us/1o0S0F3I1X0r/Screen%20Shot%202016-08-06%20at%201.14.39%20AM.png)\n\n### Delete Tasks\nSynchronously posts to `/delete/tasks`  \nAsynchronously posts to `/api/tasks`\n\n![](http://j4p.us/0P2C3h2n070H/Screen%20Shot%202016-08-06%20at%201.14.55%20AM.png)\n\n## Database\nA simple PostgreSQL database schema is used to store our tasks. See `server.js` for the queries that interact with the database to add, complete, archive, unarchive, and delete\u0026nbsp;tasks.\n\n```sql\nCREATE TABLE \"tasks\" (\n  id SERIAL PRIMARY KEY,\n  title varchar(255) NOT NULL DEFAULT '',\n  completed smallint NOT NULL DEFAULT '0',\n  archived smallint NOT NULL DEFAULT '0'\n);\n```\n\n## Accessibility Proclaimer\nThis component strives for WCAG 2.0 Guidelines Level AA. Please [open an issue](https://github.com/jpdevries/synctodo/issues/new) for any accessibility issue, feedback, or\u0026nbsp;concern.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpdevries%2Fsynctodo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjpdevries%2Fsynctodo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpdevries%2Fsynctodo/lists"}