{"id":21440788,"url":"https://github.com/kingyiusuen/easynote","last_synced_at":"2026-04-11T01:02:15.795Z","repository":{"id":104638782,"uuid":"439544038","full_name":"kingyiusuen/easynote","owner":"kingyiusuen","description":"A note-taking app built with TypeScript, React, Node, Express, PostgreSQL and TypeORM","archived":false,"fork":false,"pushed_at":"2023-06-14T03:08:12.000Z","size":2577,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-17T00:34:54.974Z","etag":null,"topics":["express","fullstack","nodejs","postgresql","react","redux","typeorm","typescript"],"latest_commit_sha":null,"homepage":"","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/kingyiusuen.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":"2021-12-18T06:22:16.000Z","updated_at":"2023-04-24T13:33:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"dc851573-eb9e-45c7-8ae9-3d81af885f2d","html_url":"https://github.com/kingyiusuen/easynote","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kingyiusuen/easynote","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingyiusuen%2Feasynote","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingyiusuen%2Feasynote/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingyiusuen%2Feasynote/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingyiusuen%2Feasynote/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kingyiusuen","download_url":"https://codeload.github.com/kingyiusuen/easynote/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingyiusuen%2Feasynote/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265892293,"owners_count":23845002,"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":["express","fullstack","nodejs","postgresql","react","redux","typeorm","typescript"],"created_at":"2024-11-23T01:18:38.531Z","updated_at":"2026-04-11T01:02:10.768Z","avatar_url":"https://github.com/kingyiusuen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Easynote\n\n[![License](https://img.shields.io/github/license/kingyiusuen/easynote)](https://github.com/kingyiusuen/easynote/blob/master/LICENSE)\n\nEasynote is a single-page note-taking application that features a rich text editor.\n\n![](assets/screenshot.png)\n\n## Technologies\n\n- TypeScript in both frontend and backend\n- React for frontend\n- Redux for state management\n- Axios for making HTTP requests\n- Styled-component and [MUI](https://mui.com/) for styling\n- [Quill](https://quilljs.com/) for WYSIWYG editor\n- Node.js and Express for backend\n- PostgreSQL for storing user information and notes\n- [TypeORM](https://typeorm.io/) for automating object-to-table and table-to-object conversion\n\n## Features\n\n### Notebooks\n\n\u003cimg src=\"assets/notebook.gif\" width=\"600px\" /\u003e\n\nUsers can organize their notes with notebooks. To create a new notebook, click the \"+\" button in the sidebar. To view the notes within a notebook, click the notebook name in the sidebar. The notes are sorted by last updated time in descending order. To rename and delete a noteobok, click the \"more action\" button (shown as three dots) in the header of the note list.\n\n---\n\n### Notes\n\n\u003cimg src=\"assets/note.gif\" width=\"600px\" /\u003e\n\nEasynote features a rich text editor powered by [Quill](https://quilljs.com/), which allows users to use different heading levels, font sizes and colors, etc. Notes are autosaved as soon as the user stops typing. There is a sync indicator in the bottom right corner of the editor.\n\nUsers can move the note to a different notebook and delete the note permenantly by choosing the corresponding options in the \"more action\" button in the top right corner of the editor.\n\nUsers can also toggle between full screen and normal display modes.\n\n---\n\n### Mobile Responsive\n\n\u003cimg src=\"assets/responsive.gif\" width=\"300px\"\u003e\n\nEasynote is mobile responsive with the help of CSS media queries.\n\n---\n\n### Authentication\n\n\u003cimg src=\"assets/auth.png\" width=\"300px\"/\u003e\n\nUser passwords are encrpyted using [bcrypt](https://www.npmjs.com/package/bcrypt) before they are stored in the database.\nWhen a user is logged in, the server will send a JWT token to the client. The token will be stored in the localStorage of the client's browser. On every page reload, the website will check whether an unexpired JWT token exists in localStorage and authenticate the user automatically. Therefore, users don't need to login again even after they close the webpage. The token is included in the authorization header of every HTTP request. The server uses [passport.js](http://www.passportjs.org/) to authenticate the token.\n\n## Planned Features\n\n- Pin notes\n- Search notes\n- Change sort order\n- Change password\n- Refresh token\n\n## Installation\n\n- Clone the repo.\n- Run `npm install` to install dependencies for the server.\n- Run `cd client` and then `npm install` to install dependencies for the client.\n\n## Local Development\n\n- Install PostgreSQL.\n- Create a `.env` file. Put in a secret key following the format of `.env.example`.\n- Run `npm run client` to start the client.\n- Run `npm run server` to start the server.\n- Run `npm run dev` to start the client and the server concurrently.\n\n## Deploy to Heroku\n\nInstall [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli).\n\nLogin to your Heroku account.\n\n```\nheroku login\n```\n\nCreate a new Heroku app.\n\n```\nheroku create \u003cYOUR_APP_NAME\u003e\n```\n\nSetup Heroku Postgres Database. This should return a `DATABASE_URL`.\n\n```\nheroku addons:create heroku-postgresql:hobby-dev --app \u003cYOUR_APP_NAME\u003e\n```\n\nBy default, Heroku will strip out the packages declared under devDependencies before deploying the application. However, Heroku will need the type definition packages `@types/*` to build the app with the `tsc` TypeScript compiler, so we need to disable this option.\n\n```\nheroku config:set NPM_CONFIG_PRODUCTION=false\n```\n\nAdd JWT secret key as an environment variable\n\n```\nheroku config:set JWT_SECRET=\u003cYOUR_SECRET_KEY\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkingyiusuen%2Feasynote","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkingyiusuen%2Feasynote","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkingyiusuen%2Feasynote/lists"}