{"id":21417460,"url":"https://github.com/aminumado/blog_client","last_synced_at":"2026-04-19T19:04:49.156Z","repository":{"id":61997661,"uuid":"539372745","full_name":"AminuMado/blog_client","owner":"AminuMado","description":"A blog site. Built with Typescript","archived":false,"fork":false,"pushed_at":"2022-11-02T10:16:17.000Z","size":10286,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-16T19:19:44.346Z","etag":null,"topics":["jwt-authentication","mongodb","react","rest-api","typescript"],"latest_commit_sha":null,"homepage":"https://aminumado.github.io/blog_client/","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/AminuMado.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}},"created_at":"2022-09-21T08:00:41.000Z","updated_at":"2022-11-02T10:15:13.000Z","dependencies_parsed_at":"2022-10-25T00:00:42.127Z","dependency_job_id":null,"html_url":"https://github.com/AminuMado/blog_client","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AminuMado/blog_client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AminuMado%2Fblog_client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AminuMado%2Fblog_client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AminuMado%2Fblog_client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AminuMado%2Fblog_client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AminuMado","download_url":"https://codeload.github.com/AminuMado/blog_client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AminuMado%2Fblog_client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32018765,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"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":["jwt-authentication","mongodb","react","rest-api","typescript"],"created_at":"2024-11-22T19:15:37.849Z","updated_at":"2026-04-19T19:04:49.137Z","avatar_url":"https://github.com/AminuMado.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\n    \u003ch1 align=\"center\"\u003eBlog Site\u003c/h1\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nA simple blog application built with the MERN stack. Browse from the current selection of blog posts made by other members or share your own. Join in on the discussion of your favorite content.\nThe backend is built out using Node.js and the Express framework. The frontend uses React to create a user-friendly interface. MongoDB Atlas is used for the database working with mongoose. The application is deployed with Heroku. On the backend, the main REST API endpoints are built following the MVC architecture enabling ease of development. API endpoints are secured behind appropriate authentication middlewares.Authentication is handled using JWT. On the frontend with React, the app is structured cleanly with different pages and components. State management is done primarily through basic useState along with useReducer, useContext, and a custom hook for more complex logic. Authentication and blog services are created for ease of use when interacting with the backend APIs.\n\n## Features\n\n- User authentication with JWTs (JSON Web Token).\n- Rich text editor for creating posts via the TincyMCE API\n- User authorization and permissions management.\n- Server side APIs are written using REST architecture.\n- Securing passwords using bcryptjs.\n- Client side form validation using react-hook-form before submitting user data.\n- Schema validation using Mongoose.\n\n## Learnings\n\n\u003e The importance of returning back good JSON, it should be exactly what is needed and requested- nothing more.\n\n\u003e The power an API can offer in terms of decoupling the backend and frontend eg: using a seperate CMS to add, update and delete posts \u0026 comments.\n\n\u003e How to create and store JWT tokens and the flexibility they offer in terms of accessing an API\n\n\u003e The importance of UseEffect in cleaning up async requests that are yet to be processed- avoiding memory leaks\n\n## Built using\n\n- MERN Stack\n- API deployed using Heroku\n\n## Links\n\n\u003cp\u003e\n\u003ca href=\"https://aminumado.github.io/blog_client\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e 🔗 View the project here!\u003c/a\u003e\n👀\n\n\u003ca href=\"https://github.com/AminuMado/blog_api\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e🔗 Blog API\u003c/a\u003e\n\n## \u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faminumado%2Fblog_client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faminumado%2Fblog_client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faminumado%2Fblog_client/lists"}