{"id":47986906,"url":"https://github.com/ridwaanhall/ridwaanhall-com","last_synced_at":"2026-04-04T11:29:00.061Z","repository":{"id":286322024,"uuid":"949357813","full_name":"ridwaanhall/ridwaanhall-com","owner":"ridwaanhall","description":"🚀 Django portfolio with real-time GitHub \u0026 WakaTime analytics, interactive guestbook, enterprise grade security, and lightning-fast performance.","archived":false,"fork":false,"pushed_at":"2026-03-27T04:42:58.000Z","size":12773,"stargazers_count":35,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-27T16:58:45.814Z","etag":null,"topics":["django","django-portfolio","flexforge","portfolio","portfolio-website","tailwind-portfolio","vercel"],"latest_commit_sha":null,"homepage":"https://ridwaanhall.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ridwaanhall.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["ridwaanhall"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"ridwaanhall","thanks_dev":null,"custom":null}},"created_at":"2025-03-16T09:19:21.000Z","updated_at":"2026-03-27T04:42:56.000Z","dependencies_parsed_at":"2025-04-14T14:31:48.974Z","dependency_job_id":"183f2e89-9991-44fe-8a4e-6b95ca7d6666","html_url":"https://github.com/ridwaanhall/ridwaanhall-com","commit_stats":null,"previous_names":["ridwaanhall/ridwaanhall_dev","ridwaanhall/ridwaanhall_com","ridwaanhall/ridwaanhall-com"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ridwaanhall/ridwaanhall-com","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ridwaanhall%2Fridwaanhall-com","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ridwaanhall%2Fridwaanhall-com/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ridwaanhall%2Fridwaanhall-com/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ridwaanhall%2Fridwaanhall-com/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ridwaanhall","download_url":"https://codeload.github.com/ridwaanhall/ridwaanhall-com/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ridwaanhall%2Fridwaanhall-com/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31397890,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["django","django-portfolio","flexforge","portfolio","portfolio-website","tailwind-portfolio","vercel"],"created_at":"2026-04-04T11:28:59.615Z","updated_at":"2026-04-04T11:29:00.038Z","avatar_url":"https://github.com/ridwaanhall.png","language":"Python","funding_links":["https://github.com/sponsors/ridwaanhall","https://buymeacoffee.com/ridwaanhall"],"categories":[],"sub_categories":[],"readme":"# 🚀 FlexForge - Advanced Developer Portfolio Platform\n\n[![Django](https://img.shields.io/badge/Django-5.2-092E20?style=flat\u0026logo=django\u0026logoColor=white)](https://djangoproject.com/)\n[![Python](https://img.shields.io/badge/Python-3.12+-3776AB?style=flat\u0026logo=python\u0026logoColor=white)](https://python.org/)\n[![TailwindCSS](https://img.shields.io/badge/TailwindCSS-4.1-06B6D4?style=flat\u0026logo=tailwindcss\u0026logoColor=white)](https://tailwindcss.com/)\n\n![FlexForge Portfolio](https://ridwaanhall.com/static/img/project/ridwaanhall_com_2025070701.webp)\n\n\u003e **A modern portfolio template with individual file data management, real-time API integrations, configurable guestbook, and enterprise-grade security.**\n\n## ✨ Key Features\n\n- **🗂️ Individual File System**: Each project and blog post in separate Python files\n- **📊 Real-time Analytics**: GitHub and WakaTime API integration\n- **💬 Interactive Guestbook**: Configurable chat-like messaging with email notifications (can be disabled)\n- **🚀 High Performance**: 99+/100 PageSpeed scores\n- **🛡️ Security-First**: CSP, HSTS, XSS protection\n- **📱 Responsive Design**: Mobile-optimized with Tailwind CSS\n- **🖼️ Image Optimization**: wsrv.nl - Image proxy/CDN for automatic resizing\n\n## 🛠️ Tech Stack\n\n- **Backend**: \u003eDjango 5.2, Python 3.12\n- **Frontend**: TailwindCSS, Vanilla JavaScript\n- **Data**: Individual Python files for content management\n- **APIs**: GitHub API, WakaTime API\n- **Security**: django-csp, permissions-policy, XSS protection\n- **Deployment**: Vercel, WhiteNoise\n\n## 📊 PageSpeed Insights\n\n[![Desktop: 99.5](https://img.shields.io/badge/Desktop-99.5-success?style=for-the-badge)](https://pagespeed.web.dev/analysis/https-ridwaanhall-com/rstqtcxhc0?form_factor=desktop)\n[![Mobile: 99](https://img.shields.io/badge/Mobile-99-success?style=for-the-badge)](https://pagespeed.web.dev/analysis/https-ridwaanhall-com/rstqtcxhc0?form_factor=mobile)\n\n| Platform | Performance | Accessibility | Best Practices | SEO | Average |\n|----------|-------------|---------------|----------------|-----|---------|\n| **Desktop** | 98 | 100 | 100 | 100 | **99.5** |\n| **Mobile** | 96 | 100 | 100 | 100 | **99** |\n| **Average** | **97** | **100** | **100** | **100** | **99.25** |\n\n## ⚡ Quick Start\n\n```bash\n# Clone repository\ngit clone https://github.com/ridwaanhall/ridwaanhall-com.git\ncd ridwaanhall-com\n\n# Setup virtual environment\npython -m venv venv\nsource venv/bin/activate  # Linux/Mac\n# or\nvenv\\Scripts\\activate     # Windows\n\n# Install dependencies\npip install -r requirements.txt\n\n# Install Tailwind CSS\nnpm install tailwindcss @tailwindcss/cli\n\n# Build Tailwind CSS (for development with watch mode)\nnpx @tailwindcss/cli -i ./static/css/input.css -o ./staticfiles/css/global.css --watch\n\n# In a separate terminal, run development server\npython manage.py runserver\n```\n\n### Tailwind CSS Development\n\nFor styling changes, ensure Tailwind CSS is running in watch mode:\n\n```bash\n# Development (with watch and minification)\nnpx @tailwindcss/cli -i ./static/css/input.css -o ./staticfiles/css/global.css --watch --minify\n\n# Production build\nnpx @tailwindcss/cli -i ./static/css/input.css -o ./staticfiles/css/global.css --minify\n```\n\nMake sure your `static/css/input.css` contains:\n\n```css\n@import \"tailwindcss\";\n```\n\n## 🔧 Environment Configuration\n\nCreate `.env` file:\n\n```env\n# Core Settings\nBASE_URL=\"https://your-domain.com\"\nSECRET_KEY=\"your-django-secret-key\"\nDEBUG=True\nALLOWED_HOSTS=\"\"\n\n# Feature Toggles\nGUESTBOOK_PAGE=True  # Set to False to disable guestbook\nWSRV_IMAGE_OPTIMIZATION=True\n\n# Email\nCONTACT_EMAIL_RECIPIENT=\"hi@ridwaanhall.com\"\n\n# API Keys\nACCESS_TOKEN=\"your-github-token\"\nWAKATIME_API_KEY=\"your-wakatime-key\"\nWEB3FORM_PAC=\"\"\n\n# OAuth (Required only when GUESTBOOK_PAGE=True)\nGOOGLE_CLIENT_ID=\"\"\nGOOGLE_CLIENT_SECRET=\"\"\nGH_CLIENT_ID=\"\"\nGH_CLIENT_SECRET=\"\"\n\n# PostgreSQL Database (Production only)\nPOSTGRES_DATABASE=\"your-database\"\nPOSTGRES_HOST=\"your-host\"\nPOSTGRES_PASSWORD=\"your-password\"\nPOSTGRES_USER=\"your-user\"\nPOSTGRES_PORT=\"5432\"\n\n# Image URLs (Optional)\nBLOG_BASE_IMG_URL=\"\"\nPROJECT_BASE_IMG_URL=\"\"\n```\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `BASE_URL` | Yes | Your domain URL |\n| `SECRET_KEY` | Yes | Django secret key |\n| `DEBUG` | No | Enable debug mode (default: False) |\n| `ALLOWED_HOSTS` | No | Comma-separated allowed hosts for development |\n| `ACCESS_TOKEN` | Yes | GitHub personal access token |\n| `WAKATIME_API_KEY` | Yes | WakaTime API key |\n| `WEB3FORM_PAC` | No | Web3Forms access key for contact forms |\n| `GUESTBOOK_PAGE` | No | Enable/disable guestbook (default: True) |\n| `WSRV_IMAGE_OPTIMIZATION` | No | Enable wsrv.nl image optimization (default: True) |\n| `CONTACT_EMAIL_RECIPIENT` | No | Email that receives contact/guestbook notifications (default: hi@ridwaanhall.com) |\n| `GOOGLE_CLIENT_ID` | If guestbook enabled | Google OAuth client ID |\n| `GOOGLE_CLIENT_SECRET` | If guestbook enabled | Google OAuth secret |\n| `GH_CLIENT_ID` | If guestbook enabled | GitHub OAuth client ID |\n| `GH_CLIENT_SECRET` | If guestbook enabled | GitHub OAuth secret |\n| `POSTGRES_DATABASE` | Production only | PostgreSQL database name |\n| `POSTGRES_HOST` | Production only | PostgreSQL host |\n| `POSTGRES_PASSWORD` | Production only | PostgreSQL password |\n| `POSTGRES_USER` | Production only | PostgreSQL username |\n| `POSTGRES_PORT` | Production only | PostgreSQL port (default: 5432) |\n| `BLOG_BASE_IMG_URL` | No | Base URL for blog images (defaults to BASE_URL/static/img/blog) |\n| `PROJECT_BASE_IMG_URL` | No | Base URL for project images (defaults to BASE_URL/static/img/project) |\n\n### Environment Variables Documentation\n\nThis project requires several environment variables for proper functionality. Create a `.env` file in your project root with the following configuration:\n\n#### Core Application Settings\n\n- **BASE_URL**: Your application's domain URL (e.g., \u003chttps://ridwaanhall.com\u003e)\n- **SECRET_KEY**: Django's secret key for cryptographic signing - generate using `python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'`\n- **DEBUG**: Set to `True` for development, `False` for production\n- **ALLOWED_HOSTS**: Comma-separated list of allowed hosts for development (only used when DEBUG=True)\n\n#### API Integration Keys\n\n- **ACCESS_TOKEN**: GitHub Personal Access Token\n  - Go to GitHub Settings → Developer settings → Personal access tokens\n  - Generate new token with repo and user permissions\n- **WAKATIME_API_KEY**: WakaTime API key for coding statistics\n  - Visit WakaTime Settings → API Key section\n  - Copy your secret API key\n- **WEB3FORM_PAC**: Web3Forms access key for contact forms (optional)\n  - Visit Web3Forms dashboard\n  - Get your access key for form submissions\n\n#### Feature Configuration\n\n- **GUESTBOOK_PAGE**: Boolean to enable/disable guestbook functionality\n  - Set to `True` to enable guestbook with authentication\n  - Set to `False` to disable and skip OAuth setup\n- **WSRV_IMAGE_OPTIMIZATION**: Enable wsrv.nl image optimization proxy\n  - Set to `True` for optimized images (recommended)\n  - Set to `False` to use original images\n\n#### OAuth Configuration (Required only when GUESTBOOK_PAGE=True)\n\n- **GOOGLE_CLIENT_ID** \u0026 **GOOGLE_CLIENT_SECRET**: Google OAuth credentials\n  - Create project at Google Cloud Console\n  - Enable Google+ API\n  - Create OAuth 2.0 credentials\n- **GH_CLIENT_ID** \u0026 **GH_CLIENT_SECRET**: GitHub OAuth credentials\n  - Go to GitHub Settings → Developer settings → OAuth Apps\n  - Create new OAuth app with your callback URLs\n\n#### Database Configuration (Production Only)\n\n- **POSTGRES_DATABASE**: PostgreSQL database name\n- **POSTGRES_HOST**: PostgreSQL host address\n- **POSTGRES_PASSWORD**: PostgreSQL password\n- **POSTGRES_USER**: PostgreSQL username\n- **POSTGRES_PORT**: PostgreSQL port (default: 5432)\n\n##### Development Database Note\n\nSQLite is used automatically in development mode (DEBUG=True)\n\n#### Image URL Configuration (Optional)\n\n- **BLOG_BASE_IMG_URL**: Base URL for blog images\n  - Defaults to `{BASE_URL}/static/img/blog` if not set\n- **PROJECT_BASE_IMG_URL**: Base URL for project images\n  - Defaults to `{BASE_URL}/static/img/project` if not set\n\n## 📚 Documentation\n\nComprehensive documentation for each application component:\n\n| Document | Description |\n|----------|-------------|\n| [Core App](docs/core.md) | Base views, contact form, email handler, image optimization, validators |\n| [Guestbook App](docs/guestbook.md) | OAuth messaging, threaded replies, email notifications, author management |\n| [About App](docs/about.md) | Personal info display (experiences, education, certifications, awards) |\n| [Blog App](docs/blog.md) | Paginated blog with search, multi-image support, template tags |\n| [Projects App](docs/projects.md) | Project showcase with search, featured sorting, multi-image support |\n| [Dashboard App](docs/dashboard.md) | GitHub and WakaTime API integration with 15-min cache |\n| [SEO App](docs/seo.md) | Meta tags, Open Graph, JSON-LD schemas, sitemaps, robots.txt |\n| [OpenHire App](docs/openhire.md) | Open-to-work and hiring status display |\n| [Data App](docs/data.md) | Individual File System (IFS) for file-based content management |\n| [FlexForge Config](docs/flexforge.md) | Django settings, URL routing, context processors, deployment |\n\n## 🚀 Deployment\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?demo-description=Advanced%20developer%20portfolio%20platform%20with%20individual%20file%20data%20management%2C%20real-time%20API%20integrations%2C%20and%20enterprise-grade%20security.\u0026demo-image=https%3A%2F%2Fridwaanhall.com%2Fstatic%2Fimg%2Fproject%2Fridwaanhall_com_2025070701.webp\u0026demo-title=FlexForge%20Portfolio\u0026demo-url=https%3A%2F%2Fridwaanhall.com\u0026from=templates\u0026project-name=FlexForge%20Portfolio\u0026repository-name=flexforge-portfolio\u0026repository-url=https%3A%2F%2Fgithub.com%2Fridwaanhall%2Fridwaanhall-com)\n\n### Manual Setup\n\n1. Fork this repository\n2. Install Vercel CLI: `npm i -g vercel`\n3. Deploy: `vercel --prod`\n4. Configure environment variables in Vercel dashboard\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create feature branch: `git checkout -b feature/name`\n3. Commit changes: `git commit -m 'Add feature'`\n4. Push branch: `git push origin feature/name`\n5. Open pull request\n\n## 📄 License\n\nApache License 2.0 - See [LICENSE](LICENSE) for details.\n\n---\n\n**FlexForge** - Professional portfolio platform built with Django and modern web technologies.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fridwaanhall%2Fridwaanhall-com","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fridwaanhall%2Fridwaanhall-com","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fridwaanhall%2Fridwaanhall-com/lists"}