{"id":29480881,"url":"https://github.com/computeranything/cpt_anything_blog","last_synced_at":"2025-07-14T23:11:57.540Z","repository":{"id":285636292,"uuid":"958832853","full_name":"ComputerAnything/cpt_anything_blog","owner":"ComputerAnything","description":"FlaskAPI, React.js, Redux, PostgreSQL, Docker","archived":false,"fork":false,"pushed_at":"2025-07-12T02:34:57.000Z","size":674,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-12T04:25:40.071Z","etag":null,"topics":["flask","psql","python","react"],"latest_commit_sha":null,"homepage":"https://www.computeranything.dev","language":"JavaScript","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/ComputerAnything.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-01T20:50:26.000Z","updated_at":"2025-07-12T02:35:00.000Z","dependencies_parsed_at":"2025-04-01T21:43:29.017Z","dependency_job_id":"1d10b7b9-6279-4d90-bdf1-68f0e3ea556a","html_url":"https://github.com/ComputerAnything/cpt_anything_blog","commit_stats":null,"previous_names":["computer-anything/computer_anything_blog","computer-anything/cpt_anything_blog","computeranything/cpt_anything_blog"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ComputerAnything/cpt_anything_blog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ComputerAnything%2Fcpt_anything_blog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ComputerAnything%2Fcpt_anything_blog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ComputerAnything%2Fcpt_anything_blog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ComputerAnything%2Fcpt_anything_blog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ComputerAnything","download_url":"https://codeload.github.com/ComputerAnything/cpt_anything_blog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ComputerAnything%2Fcpt_anything_blog/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265366226,"owners_count":23753476,"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":["flask","psql","python","react"],"created_at":"2025-07-14T23:11:48.615Z","updated_at":"2025-07-14T23:11:57.519Z","avatar_url":"https://github.com/ComputerAnything.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📝 Computer Anything Blog\n\nA full-featured tech blog platform built with Flask (backend), React.js (frontend), and PostgreSQL.\nFeatures include user authentication, post creation/editing, voting, comments, and more.\n\n---\n\n## 📸 Screenshots\n\n![Blog Page](assets/Screenshot_Blog_Page.png)\n*Page for viewing and searching all blog posts*\n\n![Post Page](assets/Screenshot_Post_Page.png)\n*Page for viewing a single blog post with comments*\n\n![Profile Page](assets/Screenshot_Profile_Page.png)\n*User profile page with post history*\n\n---\n\n## ✨ Features\n\n- ✅ User registration, login, and JWT authentication\n- 📝 Create, edit, and delete blog posts\n- 🗳️ Upvote/downvote posts\n- 💬 Comment on posts (with delete support)\n- 🔍 Search and filter posts by tags\n- 🏷️ Tag support (with automatic formatting)\n- 👤 User profile and post history\n- 🖼️ Responsive, modern UI with modals and loading overlays\n- 🛡️ Secure API endpoints\n\n---\n\n## 🛠️ Backend Setup\n\n1. **Navigate to the `backend` directory:**\n\n    ```bash\n    cd backend\n    ```\n\n2. **Install dependencies:**\n\n    ```bash\n    pip install -r requirements.txt\n    ```\n\n3. **⚙️ Set up the database connection in `config.py`, and configure any environment variables you might need.**\n\n4. **📦 Make initial database migrations:**\n\n    ```bash\n    flask db init\n    flask db migrate -m \"initial migration\"\n    flask db upgrade\n    ```\n\n---\n\n## 🌐 Frontend Setup\n\n1. **Navigate to the `frontend` directory:**\n\n    ```bash\n    cd frontend\n    ```\n\n2. **Install dependencies:**\n\n    ```bash\n    npm install\n    ```\n\n3. **🚀 Start the React application:**\n\n    ```bash\n    npm start\n    ```\n\n---\n\n## 🐳 Docker Compose Setup\n\n1. **Build and start all services:**\n\n    ```bash\n    docker compose up --build -d\n    ```\n\n2. **Check logs for all services:**\n\n    ```bash\n    docker compose logs -f\n    ```\n\n3. **Stop all services:**\n\n    ```bash\n    docker compose down\n    ```\n\n4. **(Optional) Rebuild without cache:**\n\n    ```bash\n    docker compose build --no-cache\n    ```\n\n- Make sure you have your environment variables set in `backend/.env` and `frontend/.env` before building, use the `.env.example` files as templates.\n- The frontend should be built locally (`npm run build`) and the output copied to `backend/frontend/build` if you are not building the frontend inside Docker.\n- Run `build_and_copy_frontend.sh` to automate this process.\n\n---\n\n## 📦 Dependencies\n\n- **Backend:**\n  - Flask\n  - Flask-SQLAlchemy\n  - Flask-Migrate\n  - Flask-JWT-Extended\n  - Flask-Cors\n  - psycopg2-binary (psql database adapter)\n  - resend (for email sending)\n  - python-dotenv\n  - pytest (for testing)\n  - ruff (for linting)\n  - black (for code formatting)\n\n- **Frontend:**\n  - React\n  - React Router\n  - Axios\n  - Redux Toolkit\n  - Redux Persist\n  - React Redux\n  - Tailwind CSS\n  - react-markdown (for rendering markdown)\n  - react-quill (for rich text editing)\n  - dotenv (for environment variables)\n\n---\n\n## 🧪 Testing\n\n- **Backend:**\n  - Run tests using pytest:\n\n    ```bash\n    pytest\n    ```\n\n- **Frontend:**\n  - Run tests using Jest:\n\n    ```bash\n    npm test\n    ```\n\n---\n\n## 🔧 Environment Variables\n\n  ```sh\n  # Flask environment variables\n  SECRET_KEY=your_secret_key\n  JWT_SECRET_KEY=your_jwt_secret_key\n\n  # Database configuration\n  POSTGRES_USER=postgres_user\n  POSTGRES_PASSWORD=postgres_password\n  POSTGRES_DB=postgres_db\n  DATABASE_URL=postgres://your_username:your_password@db:5432/your_db_name\n\n  # SMTP configuration\n  RESEND_API_KEY=your_resend_api_key\n\n  # React environment variables\n  REACT_APP_BACKEND_URL=http://localhost:5000\n  REACT_APP_RECAPTCHA_SITE_KEY=your_recaptcha_site_key\n\n  # reCAPTCHA configuration\n  RECAPTCHA_SECRET_KEY=your_recaptcha_secret_key\n  ```\n\n---\n\n## 📜 License\n\nThis project is licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomputeranything%2Fcpt_anything_blog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcomputeranything%2Fcpt_anything_blog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomputeranything%2Fcpt_anything_blog/lists"}