{"id":29791969,"url":"https://github.com/ujarhr/simpleblog-cms","last_synced_at":"2026-05-17T01:34:11.429Z","repository":{"id":306628049,"uuid":"1026695052","full_name":"ujaRHR/simpleblog-cms","owner":"ujaRHR","description":"A markdown-based CMS with a built-in editor, tagging system, minimal UI, and support for easy content publishing.","archived":false,"fork":false,"pushed_at":"2025-07-26T16:32:26.000Z","size":4,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-26T21:27:16.870Z","etag":null,"topics":["blog-cms","cms-backend","koajs","mini-cms","simpleblog-cms","typescript-project"],"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/ujaRHR.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,"zenodo":null}},"created_at":"2025-07-26T12:19:13.000Z","updated_at":"2025-07-26T16:35:31.000Z","dependencies_parsed_at":"2025-07-26T21:39:14.152Z","dependency_job_id":null,"html_url":"https://github.com/ujaRHR/simpleblog-cms","commit_stats":null,"previous_names":["ujarhr/simpleblog-cms"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ujaRHR/simpleblog-cms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ujaRHR%2Fsimpleblog-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ujaRHR%2Fsimpleblog-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ujaRHR%2Fsimpleblog-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ujaRHR%2Fsimpleblog-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ujaRHR","download_url":"https://codeload.github.com/ujaRHR/simpleblog-cms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ujaRHR%2Fsimpleblog-cms/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267447320,"owners_count":24088573,"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-07-27T02:00:11.917Z","response_time":82,"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":["blog-cms","cms-backend","koajs","mini-cms","simpleblog-cms","typescript-project"],"created_at":"2025-07-28T01:01:54.260Z","updated_at":"2026-05-17T01:34:11.423Z","avatar_url":"https://github.com/ujaRHR.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch2 align=\"center\"\u003e📑 SimpleBlog CMS\u003c/h2\u003e\n\u003cp align=\"center\"\u003eSimpleBlog CMS is a headless Content Management System (CMS) for a simple blog application. It provides a RESTful API for managing users, posts, and comments.\u003c/p\u003e\n\u003cdiv align=\"center\"\u003e\n  \n![Node.js](https://img.shields.io/badge/Node.js-20.x-green.svg)\n![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)\n![Koa.js](https://img.shields.io/badge/Koa.js-3.0-lightgrey.svg)\n![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16.x-skyblue.svg)\n![Nodemailer](https://img.shields.io/badge/Nodemailer-7.0-orange.svg)\n![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)\n\n\u003c/div\u003e\n\n## Features\n- User Authentication: Secure user registration and login using JSON Web Tokens (JWT).\n- Post Management: Full CRUD (Create, Read, Update, Delete) functionality for blog posts.\n- Comment System: Users can add comments and replies to posts. Full CRUD on comments is also supported.\n- Markdown to HTML: Automatically converts post content from Markdown to HTML.\n- Password Hashing: Securely hashes user passwords before storing them in the database.\n- Environment-based Configuration: Easy setup using environment variables.\n\n## Tech Stack\n- Backend: Node.js, Koa.js\n- Database: PostgreSQL with Sequelize ORM\n- Language: TypeScript\n- Authentication: JSON Web Tokens (JWT), bcrypt.js for hashing\n- Content: `marked` for Markdown to HTML conversion and `DomPurify` for converted HTML sanitization.\n- Emailing: `nodemailer` for sending emails (email verification, password resets).\n\n## Structure\n```\n/src\n├── /config        # Environment variables and configuration\n├── /controllers   # Request handlers and business logic\n├── /middleware    # Koa middleware (e.g., auth)\n├── /models        # Sequelize schemas and models\n├── /routes        # API route definitions\n├── /utils         # Utility functions\n└── app.ts         # Application entry point\n```\n\n## System Architecture Overview\n```mermaid\nsequenceDiagram\n    participant Client\n    participant API as \"API (Koa.js)\"\n    participant DB as \"DB (PostgreSQL)\"\n\n    Client-\u003e\u003eAPI: POST /api/auth/register (name, email, password)\n    API-\u003e\u003eAPI: Hash password (e.g., bcrypt)\n    API-\u003e\u003eDB: INSERT INTO users (...)\n    DB--\u003e\u003eAPI: Return created user row\n    API-\u003e\u003eAPI: Generate JWT\n    API--\u003e\u003eClient: Respond with User Info \u0026 JWT\n\n    Client-\u003e\u003eAPI: POST /api/auth/login (email, password)\n    API-\u003e\u003eDB: SELECT * FROM users WHERE email = ?\n    DB--\u003e\u003eAPI: Return user row (with hashed password)\n    API-\u003e\u003eAPI: Compare provided password with stored hash\n    alt Passwords Match\n        API-\u003e\u003eAPI: Generate JWT\n        API--\u003e\u003eClient: Respond with JWT\n    else Passwords Do Not Match\n        API--\u003e\u003eClient: Respond with 401 Unauthorized\n    end\n\n    Client-\u003e\u003eAPI: GET /api/posts (Authorization: Bearer JWT)\n    API-\u003e\u003eAPI: Verify JWT\n    alt JWT is Valid\n        API-\u003e\u003eDB: SELECT * FROM posts\n        DB--\u003e\u003eAPI: Return post rows\n        API--\u003e\u003eClient: Respond with posts data\n    else JWT is Invalid\n        API--\u003e\u003eClient: Respond with 401 Unauthorized\n    end\n```\n\n## Getting Started\nFollow these instructions to get a copy of the project up and running on your local machine for development and testing purposes.\n#### Prerequisites\n- Node.js (v20+ recommended)\n- PostgreSQL is installed and running.\n\n#### Installation\n1. Clone the repository:\n```\ngit clone https://github.com/ujarhr/simpleblog-cms.git\ncd simpleblog-cms\n```\n2. Install dependencies:\n```\npnpm install\n```\n3. Set up environment variables:\nCreate a `.env` file in the root of the project by copying the example file:\n```\ncp .env.example .env\n```\n4. Now, open the `.env` file and fill in the required values:\n```\nENV=development\nPORT=3000\nJWT_SECRET=A_Long_Random_Secret\n\n# Project Info\nPROJECT_NAME=SimpleBlog CMS\nPROJECT_EMAIL=hello@rhraju.com\n\n# Database Configurations\nDB_TYPE=postgres\nDB_HOST=127.0.0.1\nDB_PORT=5432\nDB_USER=root\nDB_PASS=password\nDB_NAME=simpleblog\n\n# SMTP Configurations\nSMTP_HOST=smtp.ethereal.email\nSMTP_PORT=587\nSMTP_USER=demo@ethereal.email\nSMTP_PASS=Your_Ethereal_Password\n```\n\n5. Running the Application:\n```\npnpm run dev\n```\n\n#### Overall Project Details -\u003e [Markdown Note-taking App](https://roadmap.sh/projects/markdown-note-taking-app)\n## License\nThis project is licensed under the MIT License - see the LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fujarhr%2Fsimpleblog-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fujarhr%2Fsimpleblog-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fujarhr%2Fsimpleblog-cms/lists"}