{"id":16417434,"url":"https://github.com/rob32/dev-case","last_synced_at":"2025-10-26T20:30:37.732Z","repository":{"id":45678022,"uuid":"514006841","full_name":"rob32/dev-case","owner":"rob32","description":"A privacy-focused and secure CMS, Blog and Portfolio made with Python \u0026 Django. Designed with developers and IT professionals in mind.","archived":false,"fork":false,"pushed_at":"2023-02-12T21:14:04.000Z","size":1514,"stargazers_count":95,"open_issues_count":0,"forks_count":8,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-11T07:12:25.714Z","etag":null,"topics":["blog","cms","django","docker","feed","portfolio","privacy-focused","python","resume","rss","website"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rob32.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"ko_fi":"rob32"}},"created_at":"2022-07-14T18:24:18.000Z","updated_at":"2024-09-29T14:24:08.000Z","dependencies_parsed_at":"2024-10-11T07:22:01.536Z","dependency_job_id":null,"html_url":"https://github.com/rob32/dev-case","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob32%2Fdev-case","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob32%2Fdev-case/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob32%2Fdev-case/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rob32%2Fdev-case/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rob32","download_url":"https://codeload.github.com/rob32/dev-case/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238394323,"owners_count":19464583,"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":["blog","cms","django","docker","feed","portfolio","privacy-focused","python","resume","rss","website"],"created_at":"2024-10-11T07:11:30.495Z","updated_at":"2025-10-26T20:30:32.342Z","avatar_url":"https://github.com/rob32.png","language":"Python","readme":"\n![alt text](README/logo-final.png?raw=true)\n\nA privacy-focused and secure CMS made with Python \u0026 Django.\n\n![GitHub](https://img.shields.io/github/license/rob32/dev-case)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit\u0026logoColor=white)](https://github.com/pre-commit/pre-commit)\n![Test-Lint Action](https://github.com/rob32/dev-case/actions/workflows/test-lint.yml/badge.svg)\n\nDevCase was designed for developers and IT professionals. It is a tool to help you get your own blog and portfolio online quickly and easily.\n\n---\n\n# Features\n\n- Responsive and uniqe design\n- Configuration via Django-Admin\n- Blog\n- Portfolio \u0026 Project-Showcase\n- Social Media Links/Icons\n- About-Me with Skills (optional with downloadable Resume)\n- Markdown support with Syntaxhighlight and TOC\n- Contact-Form (with captchas)\n- RSS\n- Search\n- Dynamic Pages (Footer)\n- Dark Django-Admin Theme\n- Settings for Favicon\n- Optimized for good SEO\n- Dynamic sitemap.xml and robots.txt\n- Settings for S3 compatible-storage (optional)\n- Commenting System (with captchas)\n- Email notification (optional)\n- Supports Umami, Plausible analytics (optional)\n\n**Demo/Example:** [rburkhardt.com](https://rburkhardt.com/)\n\n[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/rob32/dev-case/tree/prod-app-platform)\n\n# Table of contents\n\n- [Features](#features)\n- [Table of contents](#table-of-contents)\n- [Screenshots](#screenshots)\n- [Quick-Start (Docker)](#quick-start-docker)\n- [Local Development](#local-development)\n  - [Setup](#setup)\n  - [Frontend](#frontend)\n  - [Tests](#tests)\n- [Settings \u0026 Example .env](#settings--example-env)\n- [Deployment Notes](#deployment-notes)\n  - [DigitalOcean App Platform](#digitalocean-app-platform)\n  - [SSL / HSTS](#ssl--hsts)\n  - [S3 Storage](#s3-storage)\n  - [Admin Location](#admin-location)\n  - [Sitemap.xml](#sitemapxml)\n  - [Robots.txt](#robotstxt)\n  - [Email \u0026 Notification](#email--notification)\n  - [Umami Analytics](#umami-analytics)\n  - [Plausible Analytics](#plausible-analytics)\n- [Contribution](#contribution)\n- [Todo/Roadmap](#todoroadmap)\n- [Acknowledgements](#acknowledgements)\n- [License](#license)\n\n# Screenshots\n\nHome\n\n![alt text](README/screenshots/home-2.png?raw=true)\n\nAbout\n\n![About Page - Example](README/screenshots/about-1.png?raw=true)\n\nBlogpost with image (new version has comments-system)\n\n![Post with Image - Example](README/screenshots/post-with-image-1.png?raw=true)\n\nBlogpost without image (new version has comments-system)\n\n![Post without Image - Example](README/screenshots/post-without-image-1.png?raw=true)\n\nContact Page (new version has captchas)\n\n![Contact Page](README/screenshots/contact-1.png?raw=true)\n\nAdmin Dashboard\n\n![Admin Dashboard](README/screenshots/admin-1.png?raw=true)\n\n\nAdmin - About Config\n\n![Admin Page - About Config](README/screenshots/admin-about-settings.png?raw=true)\n\n\n# Quick-Start (Docker)\n\nThe fastest and easiest way to test dev-case **locally**:\n\n```\ngit clone git@github.com:rob32/dev-case.git\ncd dev-case\ndocker-compose up -d --build\ndocker-compose exec web python manage.py migrate\ndocker-compose exec web python manage.py createsuperuser\n```\n\n**Important**:\n\nCreate a new .env file with the following content (before `docker-compose up -d --build`):\n\n```\nDEBUG=True\nDATABASE_URL=psql://postgres:postgres@db:5432/postgres\n```\n\nGo to  `http://127.0.0.1:8000/` and check if all worked.\n\n# Local Development\n\nDevelopment environment with Python (venv) and Node (optional).\n\n## Setup\n\nTested with GNU/Linux \u0026 Mac:\n\n```\ngit clone git@github.com:rob32/dev-case.git\ncd dev-case\npython3 -m venv venv \u0026\u0026 source venv/bin/activate\npip install -r requirements-dev.txt\npython3 manage.py migrate\npre-commit install\n```\n\ncreate a .env file with at least the following content:\n\n```\nDEBUG=True\n# only if postgres is used, uncomend the next line (example):\n# DATABASE_URL=psql://postgres:postgres@db:5432/postgres\n```\n\nStart the Development-Server with `python3 manage.py runserver`\n\nGo to  `http://127.0.0.1:8000/`\n\n## Frontend\n\n```\n# Install dependecies with:\nnpm install\n\n# Build \"Fronted\" manually (uses `rm -rf` for cleaning):\nnpm run build\n```\n\nOptional: Start Backend-Server and Esbuild in watch-mode at the same time with `npm start`.\n\n\n## Tests\n\n```\n# Unit/Integration Tests:\npython3 manage.py test\n\n# Code Quality with the help of pre-commit\npre-commit run -a -v\n```\n\n# Settings \u0026 Example .env\n\nA selection of possible settings via environment variables:\n\n```\nSECRET_KEY=insecure-secretkey12345\nDEBUG=FALSE\nALLOWED_HOSTS=my-domain-name.com\nDATABASE_URL=psql://postgres:postgres@db:5432/postgres\nADMIN_LOCATION=dev-case/\nROBOTS_DISALLOW=/contact/,/private-file.html`\n\nFEED_TITLE=\"My Feed Title\"\nFEED_DESCRIPTION=\"My feed description\"\n\nUSE_UMAMI_ANALYTICS=True\nUMAMI_SCRIPT_URL=https://your-umami-app.com/umami.js\nUMAMI_DATA_WEBSITE_ID=2323-3232-2323-3232\n```\n\n# Deployment Notes\n\n**WIP**\n\nFor deployment/production there are two branches at the moment:\n\n - DO’s App Platform: [prod-app-platform](https://github.com/rob32/dev-case/tree/prod-app-platform)\n - Traditional (VPS, Nginx etc.): [main](https://github.com/rob32/dev-case/tree/main)\n - Docker-Compose: WIP\n\n ## DigitalOcean App Platform\n\n For DigitalOcean’s App Platform you can use the \"Deploy to DigitalOcean\" button below. Please make sure you have a working S3 space/bucket with the required credentials. Guide: [How To Create a DigitalOcean Space and API Key](https://www.digitalocean.com/community/tutorials/how-to-create-a-digitalocean-space-and-api-key)\n\n [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/rob32/dev-case/tree/prod-app-platform)\n\n **After the build process completes:**\n\n Access your app’s console through the Console tab and run the following commands:\n\n- `python3 manage.py migrate` for the initial database migrations\n- `python3 manage.py createsuperuser` to create an administrative user\n\nAs a last step, make the following adjustment in your Space setting:\n\nYour Space -\u003e Settings -\u003e CORS Configurations (Add):\n\n- Add your domain (with wildcard) in \"Origin\", examples:\n  - `*ondigitalocean.app`\n  - `*example.com`\n- Allow/Check:\n  - GET, HEAD\n\nThis should solve the problem with the fonts (missing header, Access-Control-Allow-Origin)\n\n## SSL / HSTS\n\nPossible settings for production (via environment variables):\n\n```\nSECURE_SSL_REDIRECT=True\nSECURE_HSTS_SECONDS=2592000\nSECURE_HSTS_INCLUDE_SUBDOMAINS=True\nSECURE_HSTS_PRELOAD=True\n\nSESSION_COOKIE_SECURE=True\nCSRF_COOKIE_SECURE=True\n```\n\n## S3 Storage\n\nMake sure that `USE_S3_STORAGE` is set to `True`.\n\nPossible settings for S3 compatible storage (via environment variables):\n\n```\nUSE_S3_STORAGE (default=False)\nAWS_ACCESS_KEY_ID\nAWS_SECRET_ACCESS_KEY\nAWS_STORAGE_BUCKET_NAME\nAWS_S3_REGION_NAME\nAWS_S3_ENDPOINT_URL\nAWS_S3_CUSTOM_DOMAIN\nAWS_LOCATION\nAWS_IS_GZIPPED (default=False)\nAWS_S3_FILE_OVERWRITE (default=True)\nAWS_DEFAULT_ACL (default=public-read)\n```\n\n## Admin Location\n\nYou can change the location for the admin area using the `ADMIN_LOCATION` environment variable. Default is `admin/`.\n\n## Sitemap.xml\n\nChange *DOMAIN NAME* and *DISPLAY NAME* via Admin-Panel (Sites App) to your actual domain name. Default is set to \"example.com\".\n\n## Robots.txt\n\nTo add *Disallow* rules, use the `ROBOTS_DISALLOW` environment variable. For a valid Sitemap entry change your domain name as described in [Sitemap.xml](#sitemapxml).\n\nExample: `ROBOTS_DISALLOW=/contact/,/private-file.html`\n\n## Email \u0026 Notification\n\nTo receive notifications you can configure the following settings via environment variables:\n\n```\nUSE_EMAIL_SMTP (default=False)\nEMAIL_NOTIFICATION (default=False)\nEMAIL_RECIPIENT (receiver address)\n\nEMAIL_HOST\nEMAIL_HOST_USER\nEMAIL_HOST_PASSWORD\nEMAIL_USE_TLS (default=True)\nEMAIL_USE_SSL (default=False)\nEMAIL_PORT (default=587)\nDEFAULT_FROM_EMAIL\n```\n\nMake sure that `USE_EMAIL_SMTP` and `EMAIL_NOTIFICATION` is set to `True`.\n\nThe `DEFAULT_FROM_EMAIL` variable needs to have a valid value (example: admin@example.com).\n\nThis will notify you when there are new comments or when you receive a message via the contact page.\n\nIf you also want to be notified in case of server errors, set the environment variable `DJANGO_ADMINS` with your name and email address. Example:\n\n```\nDJANGO_ADMINS=YourName:example@example.com\n\n# or more\nDJANGO_ADMINS=NameOne:name-one@example.com,NameTwo:name-two@example.com\n```\n\n## Umami Analytics\n\nMake sure that the `USE_UMAMI_ANALYTICS` environment variable is set to `True`.\n\nAdditionally create a `UMAMI_SCRIPT_URL` and `UMAMI_DATA_WEBSITE_ID` environment variable with the corresponding values.\n\nExample:\n\n```\nUSE_UMAMI_ANALYTICS=True\nUMAMI_SCRIPT_URL=https://your-umami-app.com/umami.js\nUMAMI_DATA_WEBSITE_ID=2323-3232-2323-3232\n```\n\n## Plausible Analytics\n\nMake sure that the `USE_PLAUSIBLE_ANALYTICS` environment variable is set to `True`.\n\nAdditionally create a `PLAUSIBLE_SCRIPT_URL` and `PLAUSIBLE_DATA_DOMAIN` environment variable with the corresponding values.\n\nExample:\n\n```\nUSE_PLAUSIBLE_ANALYTICS=True\nPLAUSIBLE_SCRIPT_URL=https://plausible.io/js/script.js\nPLAUSIBLE_DATA_DOMAIN=example.com\n```\n\n# Contribution\n\nContributions, Feedback and Feature-Requests are always welcome. To learn more, see the [Contributor Guide](https://github.com/rob32/dev-case/blob/main/CONTRIBUTING.md)\n\n# Todo/Roadmap\n\n- ~~CI for Tests \u0026 Code Quality~~\n- ~~tweak default security~~\n- ~~tweak SEO~~\n- ~~add/finish comments for Blog~~\n- ~~add captchas~~\n- ~~refactor views (queries)~~\n- add docker-compose for production\n\n# Acknowledgements\n\nA big thanks to the following great projects:\n\n- [django](https://github.com/django/django)\n- [django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar)\n- [django-extensions](https://github.com/django-extensions/django-extensions)\n- [django-solo](https://github.com/lazybird/django-solo/)\n- [django-simple-captcha](https://github.com/mbi/django-simple-captcha)\n- [django-environ](https://github.com/joke2k/django-environ)\n- [Python-Markdown](https://github.com/Python-Markdown/markdown)\n- [pygments](https://github.com/pygments/pygments)\n- [esbuild](https://github.com/evanw/esbuild)\n\n# License\n\nThe project is available under [GNU GPLv3](https://github.com/rob32/dev-case/blob/main/LICENSE.md) Licence.\n\n---\n\nIf you like the project, please give it a star ⭐\n","funding_links":["https://ko-fi.com/rob32"],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frob32%2Fdev-case","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frob32%2Fdev-case","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frob32%2Fdev-case/lists"}