{"id":26045107,"url":"https://github.com/johndev19/portfolio-with-flask","last_synced_at":"2026-02-21T10:02:49.827Z","repository":{"id":280112085,"uuid":"941007574","full_name":"JohnDev19/Portfolio-with-Flask","owner":"JohnDev19","description":"This is a simple portfolio website built with Flask framework with administrator dashboard for content management.","archived":false,"fork":false,"pushed_at":"2025-03-01T10:02:07.000Z","size":402,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T09:38:37.794Z","etag":null,"topics":["css3","flask","html5","portfolio","python"],"latest_commit_sha":null,"homepage":"","language":"CSS","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/JohnDev19.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":"2025-03-01T08:59:07.000Z","updated_at":"2025-03-01T10:04:34.000Z","dependencies_parsed_at":"2025-03-01T10:28:35.321Z","dependency_job_id":"4e6c0872-a336-45ad-8843-221ab511ac07","html_url":"https://github.com/JohnDev19/Portfolio-with-Flask","commit_stats":null,"previous_names":["johndev19/portfolio-with-python"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JohnDev19%2FPortfolio-with-Flask","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JohnDev19%2FPortfolio-with-Flask/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JohnDev19%2FPortfolio-with-Flask/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JohnDev19%2FPortfolio-with-Flask/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JohnDev19","download_url":"https://codeload.github.com/JohnDev19/Portfolio-with-Flask/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248201265,"owners_count":21064082,"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":["css3","flask","html5","portfolio","python"],"created_at":"2025-03-07T19:31:34.693Z","updated_at":"2026-02-21T10:02:49.798Z","avatar_url":"https://github.com/JohnDev19.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfolio Website\n\nThis is a simple portfolio website built with Flask framework with administrator dashboard for content management.\n\n![Ss](6fb13f96de438b851a9fa85672808b2159e78ef5b6216855a4de2a51a3ee5b55.jpeg)\n\n## Built With\n- **Backend**: Flask (Python web framework)\n- **Database**: SQLAlchemy ORM with SQLite (local development) and PostgreSQL support (production)\n- **Frontend**: HTML, CSS, JavaScript\n- **Authentication**: Flask-Login for secure admin access\n- **Forms**: Flask-WTF for form validation and processing\n- **CSS Features**: Custom animations, responsive grid layout, and mobile-first design\n\n## Project Structure\n- **Models**: User, Project, Experience, and Service classes\n- **Forms**: Contact and authentication forms with validation\n- **Routes**: Public-facing portfolio and admin-only dashboard\n- **Templates**: Jinja2 templates with a modular approach (base layout + content sections)\n\n## Getting Started\n1. Clone the repository\n2. Install dependencies: `pip install -r requirements.txt`\n3. Run the application: `gunicorn --bind 0.0.0.0:5000 main:app`\n4. Access the website at `http://0.0.0.0:5000`\n5. Admin login at `/admin/login` (default credentials: admin/admin123)\n\n## Deployment\nThe application is configured to run with Gunicorn for production deployment on Replit.\n\n\n# Environment Variables\n\n## Settings\n\n| Variable | Description | Default Value | Required |\n|----------|-------------|---------------|----------|\n| `SESSION_SECRET` | Secret key used for signing session cookies | `\"dev-secret-key\"` | No |\n| `DATABASE_URL` | Database connection string | `\"sqlite:///portfolio.db\"` | No |\n\n## Email Configuration\n\nFlask-Mail with Gmail SMTP for sending emails. The following variables are needed for proper email functionality:\n\n| Variable | Description | Default Value | Required |\n|----------|-------------|---------------|----------|\n| `MAIL_USERNAME` | Gmail account username | None | Yes (for email functionality) |\n| `MAIL_PASSWORD` | Gmail account password or app password | None | Yes (for email functionality) |\n| `ADMIN_EMAIL` | Email address to receive contact form submissions | None | Yes (for email functionality) |\n\n## To enable the contact form to send emails, we need your email credentials:\n\n- MAIL_USERNAME: Your Gmail address\n- MAIL_PASSWORD: Your Gmail App Password (not your regular password)\n\n## To get an App Password:\n\n- a. Go to your Google Account settings\n- b. Select Security\n- c. Enable 2-Step Verification if not already done\n- d. Under \"App passwords\", generate a new app password\n- ADMIN_EMAIL: The email address where you want to receive contact form messages\n\nSee [Example](example.env)\n\n## Database Configuration\n\nThe application automatically uses SQLite by default but can be configured to use other databases:\n\n```python\napp.config[\"SQLALCHEMY_DATABASE_URI\"] = os.environ.get(\"DATABASE_URL\", \"sqlite:///portfolio.db\")\n```\n\n## Environment Variables Usage Example\n\n```python\n# Email sending example from the contact route\nmsg = Message('New Contact Form Submission',\n             sender=app.config['MAIL_DEFAULT_SENDER'],  # Uses MAIL_USERNAME\n             recipients=[app.config['ADMIN_EMAIL']])    # Uses ADMIN_EMAIL\n```\n\n## Security Notes\n\n- Never commit sensitive environment variables to version control\n- For Gmail SMTP, use an app password instead of your primary account password\n- In production, use a strong, random `SESSION_SECRET`\n\n## License\nThis project is licensed under the MIT [LICENCE](LICENCE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohndev19%2Fportfolio-with-flask","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohndev19%2Fportfolio-with-flask","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohndev19%2Fportfolio-with-flask/lists"}