{"id":27548948,"url":"https://github.com/preschmf/preschmf-task-tracker","last_synced_at":"2026-04-12T06:33:02.253Z","repository":{"id":288200571,"uuid":"964955817","full_name":"preschmf/preschmf-task-tracker","owner":"preschmf","description":"React, Fastify, SQLite task tracker","archived":false,"fork":false,"pushed_at":"2025-04-16T03:41:12.000Z","size":4665,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-16T04:46:14.575Z","etag":null,"topics":["bootstrap","fastify","jest","knex","passport","react-router","reactjs","sqlite-database","typescript","webpack"],"latest_commit_sha":null,"homepage":"","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/preschmf.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,"zenodo":null}},"created_at":"2025-04-12T05:17:33.000Z","updated_at":"2025-04-16T03:50:25.000Z","dependencies_parsed_at":"2025-04-16T04:58:16.514Z","dependency_job_id":null,"html_url":"https://github.com/preschmf/preschmf-task-tracker","commit_stats":null,"previous_names":["preschmf/preschmf-task-tracker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preschmf%2Fpreschmf-task-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preschmf%2Fpreschmf-task-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preschmf%2Fpreschmf-task-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preschmf%2Fpreschmf-task-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/preschmf","download_url":"https://codeload.github.com/preschmf/preschmf-task-tracker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249606195,"owners_count":21298849,"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":["bootstrap","fastify","jest","knex","passport","react-router","reactjs","sqlite-database","typescript","webpack"],"created_at":"2025-04-19T04:30:25.200Z","updated_at":"2026-04-12T06:33:02.244Z","avatar_url":"https://github.com/preschmf.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Task Tracker\n\nThis is a full-stack task tracker/todo list app. It is a shared monorepo app that uses:\n\n- A React and Typescript frontend, bundled with Webpack.\n- Fastify for the backend server, and SQLite for the database on local for speed, and PostgreSQL when deployed to production.\n- Jest for unit tests\n\nThe app uses [passport.js](https://www.passportjs.org/) to implement OAuth2.0 for authentication of a user with either GitHub, Google, or LinkedIn strategies. The user can then create boards and tasks on those boards. [Knex](https://knexjs.org/) is used to construct queries made to the [SQLite](https://sqlite.org/) database. Every board and task are stored in the database in order to persist data after each login.\n\n## Why this app?\n\nI created this app for three main reasons:\n\n- To get more practice with SQL databases\n- To explore implementing OAuth and using it to authenticate a user and persist data\n- To explore creating, and maintaining, a shared monorepo project\n\nThis app spiraled to quite a large size, larger than I thought a task tracking app with a DB would become. Along the way I worked through many quirks with the monorepo architecture. Mainly, managing the three separate package.jsons could become tricky. In addition, trying to keep the client and the server separate, sharing no code, took some forethought. One of the inspirations for making this project a monorepo came from my role at work. At the time, we were exploring turning our frontend webapp, and its experience API, into a monorepo. Ultimately, we decided not to, and I think some of the lessons I learned from this project informed that decision.\n\n## Screenshots\n\n### Login Page:\n\n![image](https://github.com/user-attachments/assets/1fdbf0b2-48ca-4bc0-bd19-233af38a2134)\n\n### Boards Page with Task Creation:\n\n![image](https://github.com/user-attachments/assets/cdeb8ad8-7879-4ea7-8024-e5b6a41c9a72)\n\n### Boards Page with Board Creation Modal:\n\n![image](https://github.com/user-attachments/assets/fd458953-4cec-4f52-9372-85a2f4c22a4a)\n\n## Using the App\n\n### Getting Started\n\nTo get started with this repo, install each sub-projects dependencies:\n\n```bash\ncd shared \u0026\u0026 npm i\ncd ../client \u0026\u0026 npm i\ncd ../server \u0026\u0026 npm i\n```\n\n_Note: this step also sets up `husky`, `prettier`, and `pretty-quick` to re-format any code changes on a pre-commit hook._\n\nAfterward, set up your local SQLite database:\n\n```bash\ncd server \u0026\u0026 npm run migrate \u0026\u0026 npm run seed\n```\n\nThe database will be created in the file `server/task-tracker.local.sqlite3`. You can install the VS Code extension\n[SQLite Viewer](https://marketplace.visualstudio.com/items?itemName=qwtel.sqlite-viewer) to browse the database.\n\n### Tests\n\nYou can run the tests for each sub-project by running `npm test`. Tests are co-located in the same directory as their corresponding\nsource code files, and named `.test.ts`.\n\n### Sub-projects\n\n- `/client` - Client-side React app.\n- `/server` - Server-side Node.js app.\n- `/shared` - Source code and TypeScript types that are shared by `client` and `server`.\n\n### Shared code\n\nThe `/shared` sub-project is installed in both `/client` and `/server` as an npm\n\ndependency. Here is an example of how you can import shared code from within\nthose two sub-projects:\n\n```ts\nimport { greet } from 'shared/src/helpers'\n```\n\n### Postman\n\nA postman file exists to test the endpoints on the backend: [collection](https://github.com/preschmf/preschmf-task-tracker/blob/main/Task-Tracker.postman_collection.json)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpreschmf%2Fpreschmf-task-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpreschmf%2Fpreschmf-task-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpreschmf%2Fpreschmf-task-tracker/lists"}