{"id":29872281,"url":"https://github.com/hectorpulido/generic-portfolio","last_synced_at":"2026-04-24T20:32:32.326Z","repository":{"id":111766712,"uuid":"524289324","full_name":"HectorPulido/generic-portfolio","owner":"HectorPulido","description":"This is a simple portfolio/content manager made with django.","archived":false,"fork":false,"pushed_at":"2025-07-03T16:43:27.000Z","size":36,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-21T10:49:28.920Z","etag":null,"topics":["backend","django"],"latest_commit_sha":null,"homepage":"","language":"Python","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/HectorPulido.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-08-13T03:28:17.000Z","updated_at":"2025-09-13T05:10:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"2946022a-cef4-4e07-b4d8-63cd7fdb33d0","html_url":"https://github.com/HectorPulido/generic-portfolio","commit_stats":null,"previous_names":["hectorpulido/generic-portfolio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HectorPulido/generic-portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HectorPulido%2Fgeneric-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HectorPulido%2Fgeneric-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HectorPulido%2Fgeneric-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HectorPulido%2Fgeneric-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HectorPulido","download_url":"https://codeload.github.com/HectorPulido/generic-portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HectorPulido%2Fgeneric-portfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32239572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"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":["backend","django"],"created_at":"2025-07-30T20:09:37.539Z","updated_at":"2026-04-24T20:32:32.309Z","avatar_url":"https://github.com/HectorPulido.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Generic Portfolio\n\nA Dockerized Django “portfolio” application with a headless CMS interface, dynamic page and section management, and a REST/HTML hybrid front-end.\n\n## Features\n\n- **Dynamic Pages**: Create and organize pages composed of Markdown sections and images.\n- **Configurable Themes**: Store colors, fonts, logos, and more in the database via a simple key/value model.\n- **REST + Templating**: Expose pages through Django REST Framework with HTML rendering.\n- **Nested Admin**: Manage pages, sections, and images in a hierarchical interface.\n- **Arbitrary File Serving**: Upload any file and serve it by slug.\n\n## Prerequisites\n\n- Docker \u0026 Docker Compose\n- (Optional) A `.env` file at the project root to override default settings:\n  ```env\n  SECRET_KEY=your-secret-key\n  DEBUG=0\n  ALLOWED_HOSTS=your.domain.com\n  DB_NAME=mydb\n  DB_USER=myuser\n  DB_PASSWORD=mypassword\n  DB_HOST=portfoliodb\n  DB_PORT=5432\n  DJANGO_SUPERUSER_USERNAME=admin\n  DJANGO_SUPERUSER_EMAIL=admin@example.com\n  DJANGO_SUPERUSER_PASSWORD=strongpassword\n  ```\n\n## Getting Started\n\n1. **Clone the repo**\n\n   ```bash\n   git clone https://github.com/your-username/generic-portfolio.git\n   cd generic-portfolio\n   ```\n\n2. **Build \u0026 run**\n\n   ```bash\n   docker-compose up --build\n   ```\n\n3. **Access the app**\n\n   * Front-end:  `http://localhost:9900/`\n   * Admin UI:   `http://localhost:9900/admin/`\n     (use the superuser credentials from your `.env` or defaults)\n\n4. **Stop \u0026 remove**\n\n   ```bash\n   docker-compose down\n   ```\n\n## Configuration\n\n* Default configurations (colors, titles, favicon, etc.) are created automatically on startup.\n* To customize, log in to the Django admin and edit the **Config** entries.\n* Pages, sections, and images can be managed under the **Portfolio** app in admin.\n\n## Deployment\n\n* Adjust `DEBUG`, `ALLOWED_HOSTS`, and `SECRET_KEY` in your production `.env`.\n* Use `docker-compose -f docker-compose.prod.yml up --build -d` (if you create a production compose file).\n* Point your web server (Nginx, Traefik, etc.) to the Gunicorn port `8000` inside the container.\n\n## Contributing\n\n1. Fork the repo\n2. Create a feature branch\n3. Submit a pull request\n\n---\n\n\n\u003cdiv align=\"center\"\u003e\n\u003ch3 align=\"center\"\u003eLet's connect 😋\u003c/h3\u003e\n\u003c/div\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://www.linkedin.com/in/hector-pulido-17547369/\" target=\"blank\"\u003e\n\u003cimg align=\"center\" width=\"30px\" alt=\"Hector's LinkedIn\" src=\"https://github.com/HectorPulido/HectorPulido/blob/master/img/linkedin-icon.svg?raw=true\"/\u003e\u003c/a\u003e \u0026nbsp; \u0026nbsp;\n\u003ca href=\"https://twitter.com/Hector_Pulido_\" target=\"blank\"\u003e\n\u003cimg align=\"center\" width=\"30px\" alt=\"Hector's Twitter\" src=\"https://github.com/HectorPulido/HectorPulido/blob/master/img/twitter-official.svg?raw=true\"/\u003e\u003c/a\u003e \u0026nbsp; \u0026nbsp;\n\u003ca href=\"https://www.twitch.tv/hector_pulido_\" target=\"blank\"\u003e\n\u003cimg align=\"center\" width=\"30px\" alt=\"Hector's Twitch\" src=\"https://github.com/HectorPulido/HectorPulido/blob/master/img/twitch-icon.svg?raw=true\"/\u003e\u003c/a\u003e \u0026nbsp; \u0026nbsp;\n\u003ca href=\"https://www.youtube.com/channel/UCS_iMeH0P0nsIDPvBaJckOw\" target=\"blank\"\u003e\n\u003cimg align=\"center\" width=\"30px\" alt=\"Hector's Youtube\" src=\"https://github.com/HectorPulido/HectorPulido/blob/master/img/youtube-icon.svg?raw=true\"/\u003e\u003c/a\u003e \u0026nbsp; \u0026nbsp;\n\u003ca href=\"https://pequesoft.net/\" target=\"blank\"\u003e\n\u003cimg align=\"center\" width=\"30px\" alt=\"Pequesoft website\" src=\"https://github.com/HectorPulido/HectorPulido/blob/master/img/pequesoft-favicon.png?raw=true\"/\u003e\u003c/a\u003e \u0026nbsp; \u0026nbsp;\n\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhectorpulido%2Fgeneric-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhectorpulido%2Fgeneric-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhectorpulido%2Fgeneric-portfolio/lists"}