/changelog/CHANGELOG.md - zsh
user@portfolio
~
$
cat CHANGELOG.md
Changelog
All notable changes to this project will be documented in this file.
[0.8.0] - 2025-11-22
Added
- Integrated Django REST Framework (DRF) for API development.
- Files:
config/settings.py,api/views.py,api/urls.py,api/serializers.py,api/permissions.py,requirements.txt - Added
djangorestframework==3.16.1dependency - Configured REST framework with DjangoModelPermissionsOrAnonReadOnly default permissions
- Created API app with ViewSets for blog posts, users, and groups
- Routes:
/api/v1/blogposts/,/api/v1/api-auth/ - Added drf-spectacular for OpenAPI 3.0 schema generation and interactive API documentation.
- Files:
config/settings.py,config/urls.py,requirements.txt - Added
drf-spectacular==0.29.0dependency - Configured OpenAPI schema generation with custom title and description
- Public API documentation endpoints:
/api/v1/schema/- Machine-readable OpenAPI schema (YAML/JSON)/api/v1/docs/- Swagger UI (interactive testing interface)/api/v1/redoc/- ReDoc UI (clean, professional documentation)
- All documentation endpoints are publicly accessible for easy API exploration
- Implemented BlogPost API endpoint with role-based access control.
- Files:
api/views.py,api/serializers.py,api/permissions.py - Features:
- Full CRUD operations via REST API
- Slug-based lookup for blog posts
- Token and Session authentication support
- Permission system: Admin/Staff can create/edit/delete, public users can only read published posts
- Staff/Admin users can access all posts (including drafts), public users only see published posts
- Serializer includes title, excerpt, content, author, status, published_date, tags, timestamps
- Designed for integration with n8n automation workflows
- Set up n8n automation workflow integration for blog post management.
- Files:
api/views.py,api/permissions.py - Features:
- Token-based authentication for n8n webhook calls
- Staff/Admin permissions allow n8n to create, update, and manage blog posts via API
- Automated blog post publishing workflow support
- n8n can access draft posts for preview and editing before publication
- Added on-demand system metrics endpoint protected for staff users.
- Files:
core/views.py,core/urls.py - Returns CPU, memory, disk, uptime, and hostname data using
psutil - Secured with
@login_required, staff-only guard, cache bypass, and JSON responses - Added staff-only system metrics card to home page.
- Files:
templates/core/home.html - Provides "Fetch current metrics" button, responsive layout, and live data rendering
- Includes client-side formatting for byte sizes and status messaging
- Introduced
psutildependency for cross-platform resource stats. - Files:
requirements.txt
Changed
- Improved mobile layout for system stats header/button to prevent inline crowding.
- Files:
templates/core/home.html
[0.7.0] - 2025-11-20
Added
- Integrated Cal.com booking widget into contact page for appointment scheduling.
- Files:
templates/core/contact.html,core/views.py,config/settings.py - Features: Tabbed interface allowing users to choose between sending a message or booking an appointment
- Inline embed widget with month view layout
- Lazy loading: Cal.com script only loads when booking tab is clicked
- Automatic iframe fallback if embed script fails to load
- Added Cal.com configuration settings.
- Files:
config/settings.py - Settings:
CAL_COM_USERNAME,CAL_COM_BASE_URL,CAL_COM_EVENT_TYPE - Supports both hosted Cal.com and self-hosted instances
- Optional event type specification (e.g., '60min') or shows all available events
- Implemented user authentication prefill for Cal.com booking form.
- Files:
templates/core/contact.html - Features: Automatically prefills name and email for authenticated users
- Uses
get_full_name()if available, falls back to username - Secure JavaScript escaping with
escapejsfilter - Added contact form field prepopulation for authenticated users.
- Files:
core/views.py,templates/core/contact.html - Features: Automatically prepopulates name and email fields in contact form for authenticated users
- Uses
get_full_name()if available, falls back to username for name field - Prepopulates email field with user's email address
- Fields remain editable, allowing users to modify if needed
- Works on both initial page load and form validation error scenarios
- Enhanced contact page with tabbed interface.
- Files:
templates/core/contact.html - Features: "Send Message" and "Book Appointment" tabs
- Smooth tab switching with active state indicators
- Maintains terminal-style design aesthetic
- Added padding and spacing around embedded calendar
- Added scroll-to-top button for improved navigation.
- Files:
templates/base.html - Features: Fixed position button in bottom-right corner, appears after scrolling 300px
- Smooth scroll animation to top of page
- Responsive positioning (higher on mobile to avoid footer overlap)
- Fade-in/fade-out transitions with opacity and translate animations
- Works with both main container scrolling and window scrolling
- Created custom django-allauth templates matching the terminal theme.
- Files:
templates/account/login.html,templates/account/signup.html,templates/account/logout.html,templates/account/password_reset.html,templates/account/password_reset_done.html,templates/account/password_reset_from_key.html,templates/account/password_reset_from_key_done.html,templates/account/email_confirm.html,templates/account/verification_sent.html - Features: All authentication pages styled with terminal window aesthetic, including terminal prompt animations, blinking cursor, and consistent dark theme
- Design: Terminal window bar with red/yellow/green dots, monospace fonts, green accent colors, and form styling consistent with contact page
- Added login/logout navigation links to main menu.
- Files:
templates/base.html - Features: Shows "login" link when not authenticated, "logout" link when authenticated
- Responsive: Works on both desktop and mobile navigation menus
- Implemented floating toast notification system for Django messages.
- Files:
templates/base.html,templates/core/contact.html,templates/account/*.html - Features:
- Floating toast notifications appear at top-right corner instead of inline messages
- Color-coded by message type (success, error, warning, info)
- Smooth slide-in and fade-out animations
- Auto-dismiss after 5 seconds with manual close button
- Responsive design matching terminal theme aesthetic
- Removed inline message displays from all templates
- Message types: Success (green), Error (red), Warning (yellow), Info (blue)
- JavaScript-based toast system with automatic message handling from Django messages framework
- Added blog post metrics and engagement features.
- Files:
blog/models.py,blog/views.py,blog/forms.py,blog/admin.py,blog/urls.py,templates/blog/detail.html - Features:
- View tracking: Automatically increments view count once per session when a post is viewed
- Like functionality: AJAX-based like button with session-based duplicate prevention
- Comments system: Full comment form with admin approval workflow
- Share buttons: Twitter, Facebook, LinkedIn sharing and copy-to-clipboard functionality
- Models:
- Added
viewsandlikesfields toBlogPostmodel - Created
Commentmodel with name, email, content, and approval status - Created
PostLikemodel to track likes and prevent duplicates per session
- Added
- Views:
- Enhanced
blog_detailview to track views, handle comment submissions, and check like status - Added
like_postAJAX endpoint for real-time like updates without page refresh
- Enhanced
- Admin:
- Added
viewsandlikesto blog post list display - Registered
CommentandPostLikemodels with admin interface - Comments can be approved/rejected from admin panel
- Added
- Template:
- Metrics display showing views, likes, and comments count
- Interactive like button with visual feedback
- Share buttons section with social media links
- Comments section with form and approved comments list
- Migration:
0002_blogpost_likes_blogpost_views_comment_postlike.py - Implemented user profile system with automatic profile creation.
- Files:
core/models.py,core/views.py,core/urls.py,core/admin.py,core/signals.py,core/apps.py,templates/core/profile.html,config/settings.py,templates/base.html - Features:
- UserProfile model with bio, avatar, website, and location fields
- Automatic profile creation via Django signals when user is created
- Profile page accessible at
/profile/with terminal-themed design - Login redirect now sends users to their profile page
- Profile link added to navigation menu for authenticated users
- Models:
- Created
UserProfilemodel with OneToOne relationship to CustomUser - Added signals to auto-create profiles for new users
- Signals moved to separate
signals.pyfile for better code organization
- Created
- Views:
- Added
profileview with@login_requireddecorator - View uses
get_or_createto ensure profile exists for existing users
- Added
- Admin:
- Registered
UserProfilemodel in admin interface - Added list display, filters, and search functionality
- Registered
- Templates:
- Created profile page template matching terminal theme
- Displays user info, bio, avatar, location, website
- Shows account action links (Manage Email, Change Password, Logout)
- Migration:
0002_alter_customuser_managers_userprofile.py - Created additional django-allauth templates for account management.
- Files:
templates/account/email.html,templates/account/password_change.html,templates/account/password_change_done.html - Features:
- Email management page for adding, removing, and verifying email addresses
- Password change form with current and new password fields
- Password change success confirmation page
- All templates match terminal theme with consistent styling
- Terminal window bar, prompt animations, and blinking cursor
- Form validation error display and password requirements info
- Internationalization support (i18n) for all text
Changed
- Reorganized navigation menu into categorized dropdown structure.
- Files:
templates/base.html - Reduced navigation from 9 links to 4 main categories:
- home - Direct link
- about - Direct link
- work - Dropdown containing: projects, webhooks, selfhosted
- more - Dropdown containing: blog, contact, changelog, profile (authenticated), login/logout
- Desktop: Hover-based dropdowns with smooth animations
- Mobile: Click-to-expand collapsible sections
- Maintains active state highlighting for all links
- Improved navigation UX with cleaner, more organized menu structure
- Added profile link for authenticated users in "more" dropdown
- Updated contact view to pass Cal.com settings to template context.
- Files:
core/views.py - Builds calLink dynamically based on username and optional event type
- Ensures context is available even on form validation errors
- Fixed contact form email formatting issue.
- Files:
core/views.py - Fixed double-wrapping of email address in from_email field
- Now correctly uses
DEFAULT_FROM_EMAILwhich is already formatted in settings - Improved recipient email fallback logic
- Improved contact form error messaging.
- Files:
core/views.py - Consolidated duplicate success/warning messages into single informative message
- Better user experience when email sending fails but message is saved
- Reorganized signal handlers into separate file for better code organization.
- Files:
core/models.py,core/signals.py,core/apps.py - Moved UserProfile signal handlers from
models.pyto dedicatedsignals.pyfile - Added
ready()method toCoreConfigto ensure signals are loaded when app starts - Follows Django best practices for signal organization
Configuration
- Added Cal.com settings to Django settings.
- Files:
config/settings.py - Default values:
CAL_COM_USERNAME='aslany-rahim-hswvzi',CAL_COM_BASE_URL='https://cal.com',CAL_COM_EVENT_TYPE='60min' - Configurable via environment variables in
.envfile - Updated login redirect to send users to profile page.
- Files:
config/settings.py - Changed
LOGIN_REDIRECT_URLfrom/to/profile/ - Users are now redirected to their profile page after successful login
[0.6.0] - 2025-11-18
Added
- Created Webhooks app for public-facing interactive webhook integrations with n8n workflows.
- Files:
webhooks/models.py,webhooks/views.py,webhooks/urls.py,webhooks/admin.py - Templates:
templates/webhooks/list.html - Routes:
/webhooks/,/webhooks/<pk>/trigger/ - Features: Multiple webhook types with dynamic forms, AJAX-based triggering, real-time validation and feedback
- Added Webhook model with support for multiple interaction types.
- Files:
webhooks/models.py - Features:
- 6 webhook types: simple trigger, newsletter signup, quick contact, feedback form, download request, project interest
- Customizable button text and success messages
- Active/inactive status and ordering
- Helper methods to determine required fields based on webhook type
- Implemented interactive webhook forms with dynamic UI based on webhook type.
- Files:
templates/webhooks/list.html - Features:
- Newsletter signup form (email input)
- Quick contact form (name + email)
- Feedback form (message textarea)
- Download request form (email input)
- Project interest form (name + email + optional message)
- Simple trigger button (no form)
- Real-time validation and visual feedback
- Forms clear automatically on successful submission
- Enhanced webhook trigger view with comprehensive data collection.
- Files:
webhooks/views.py - Features:
- Validates required fields based on webhook type
- Collects user IP and user agent for analytics
- Sends structured JSON data to n8n webhook URLs
- Supports both AJAX and form submissions
- Custom error handling and user feedback
- Added webhooks link to navigation menu (desktop and mobile).
- Files:
templates/base.html - Active state highlighting for webhooks section
- Created management command for loading test webhook data.
- Files:
webhooks/management/commands/load_test_webhooks.py - Command:
python manage.py load_test_webhooks - Supports
--clearflag to remove existing webhooks - Includes 5 example webhooks: Newsletter Signup, Quick Contact, Website Feedback, Resume Download, Project Collaboration Interest
- Enhanced admin interface for webhook management.
- Files:
webhooks/admin.py - Features: Filterable by webhook type and status, searchable by name/description/URL, editable order and active status
- Organized fieldsets for better UX
- Created Self-Hosted Apps section for showcasing self-hosted applications and their benefits.
- Files:
selfhosted/models.py,selfhosted/views.py,selfhosted/urls.py,selfhosted/admin.py - Templates:
templates/selfhosted/list.html,templates/selfhosted/detail.html - Routes:
/selfhosted/,/selfhosted/<slug>/ - Features: Category filtering, status filtering, markdown support for descriptions and benefits, app images, multiple URL types (app URL, GitHub, documentation)
- Added SelfHostedApp model with comprehensive fields.
- Files:
selfhosted/models.py - Features:
- 9 categories: Productivity, Development, Media, Communication, Storage, Monitoring, Automation, Security, Other
- 3 status types: Active, Archived, Testing
- Markdown support for description and benefits fields
- Support for app URL, GitHub URL, and documentation URL
- Technology tags, featured flag, and ordering
- Auto-generated slugs from app name
- Implemented self-hosted apps list and detail pages with markdown rendering.
- Files:
templates/selfhosted/list.html,templates/selfhosted/detail.html,selfhosted/views.py - Features:
- Category-based filtering
- Status-based filtering
- Markdown to HTML conversion for descriptions and benefits
- Responsive design matching site aesthetic
- Links to app, GitHub, and documentation
- Technology tags display
- Added self-hosted apps link to navigation menu (desktop and mobile).
- Files:
templates/base.html - Active state highlighting for selfhosted section
- Created management command for loading test self-hosted app data.
- Files:
selfhosted/management/commands/load_test_selfhosted.py - Command:
python manage.py load_test_selfhosted - Supports
--clearflag to remove existing apps - Includes 11 example apps: n8n, Cal.com, Vaultwarden, Ollama, OpenMediaVault 7, Stirling-PDF, Uptime Kuma, Alpine IT Tools, OpenWebUI, SearXNG, Zammad
- Each app includes detailed descriptions, benefits, and relevant URLs
- Enhanced admin interface for self-hosted app management.
- Files:
selfhosted/admin.py - Features: Markdown editor for description and benefits, filterable by category and status, searchable by name/description/benefits/technologies, editable order and featured status
- Organized fieldsets for better UX
Changed
- Updated webhook page description to reflect public-facing interactive nature.
- Files:
templates/webhooks/list.html - Changed from "testing" focus to "interactive webhooks for automation and integration"
Configuration
- Added webhooks app to INSTALLED_APPS.
- Files:
config/settings.py - Added webhooks URL routing to main URL configuration.
- Files:
config/urls.py - Route:
/webhooks/includes webhooks URLs - Added selfhosted app to INSTALLED_APPS.
- Files:
config/settings.py - Added selfhosted URL routing to main URL configuration.
- Files:
config/urls.py - Route:
/selfhosted/includes selfhosted URLs - Integrated SendGrid for transactional email delivery.
- Files:
config/settings.py,core/views.py - Switched default backend to SendGrid SMTP, added API key support, and documented
.envvariables forDEFAULT_FROM_EMAIL,REPLY_TO_EMAIL, andEMAIL_FROM_NAME - Updated contact form emails to use SendGrid (with Reply-To routing to the submitter and branded From display names)
[0.5.0] - 2025-11-16
Added
- Integrated Django Allauth for comprehensive authentication and account management.
- Files:
config/settings.py,config/urls.py,core/models.py,core/admin.py - Routes:
/accounts/login/,/accounts/signup/,/accounts/logout/,/accounts/password/reset/, etc. - Features: Email-based authentication, email verification, password reset, account management
- Created custom user model with email authentication.
- Files:
core/models.py - Features: CustomUser model extending AbstractUser, email as USERNAME_FIELD, custom UserManager for email-based user creation
- Configuration:
AUTH_USER_MODEL = 'core.CustomUser'in settings - Added RSS feed for blog posts.
- Files:
blog/feeds.py,blog/urls.py - Route:
/blog/feed/ - Features: RSS 2.0 feed with latest 20 published blog posts, includes title, description, author, publication date, and update date
- Added RSS feed link to blog list page template
Changed
- Updated authentication system to use email instead of username.
- Files:
config/settings.py,core/models.py - Allauth configured with
ACCOUNT_LOGIN_METHODS = {'email'}and email verification - Enhanced user management with custom UserManager.
- Files:
core/models.py - CustomUserManager handles email-based user creation and superuser creation
- Updated admin interface to support custom user model.
- Files:
core/admin.py - CustomUserAdmin registered with Django admin
Configuration
- Added django-allauth and django.contrib.sites to INSTALLED_APPS.
- Added allauth.account.middleware.AccountMiddleware to MIDDLEWARE.
- Configured authentication backends for both Django and Allauth.
- Set up email verification, rate limiting, and session management for allauth.
[0.4.0] - 2025-11-13
Added
- Added comprehensive SEO features for better search engine visibility.
- Files:
blog/sitemap.py,projects/sitemap.py,core/sitemap.py - Route:
/sitemap.xml - Features: Dynamic sitemap generation for blog posts, projects, and static pages with proper priorities and change frequencies
- Added robots.txt endpoint for search engine crawler guidance.
- Files:
core/views.py,core/urls.py - Route:
/robots.txt - Features: Disallows admin and media directories, includes sitemap reference
- Added meta tags utility for Open Graph and Twitter Cards support.
- Files:
core/meta_tags.py - Features: Centralized meta tag generation with customizable title, description, image, and URL
- Enhanced base template with comprehensive SEO meta tags.
- Files:
templates/base.html - Features: Open Graph tags, Twitter Card tags, canonical URLs, meta descriptions
- Added favicon support with multiple sizes and formats.
- Files:
static/img/favicon/(favicon.ico, apple-touch-icon, android-chrome icons, site.webmanifest) - Added Terms of Service and Privacy Policy pages.
- Files:
core/views.py,core/urls.py,templates/core/terms.html,templates/core/privacy.html - Routes:
/terms/,/privacy/ - Added ContactMessage model for storing contact form submissions.
- Files:
core/models.py,core/admin.py - Features: Tracks email sending status, stores error messages, admin interface for managing submissions
- Enhanced home page with dynamic content.
- Files:
core/views.py,templates/core/home.html - Features: Displays featured projects, latest blog posts, and project statistics
- Added GitHub Actions workflow for automated deployment.
- Files:
.github/workflows/deploy.yml - Features: Automated deployment to DigitalOcean on tag push, handles environment setup, migrations, and service restart
- Added production-ready security settings.
- Files:
config/settings.py - Features: HTTPS enforcement, SSL redirect, secure cookies, HSTS headers, proxy SSL header configuration
- Added PostgreSQL database configuration for production.
- Files:
config/settings.py - Features: Automatic database selection (SQLite for development, PostgreSQL for production)
Changed
- Updated contact form to save submissions to database before sending email.
- Files:
core/views.py - Improved error handling and message tracking
- Enhanced admin site customization.
- Files:
config/urls.py - Customized admin site header, title, and index title
[0.3.0] - 2025-11-12
Added
- Created Projects app for showcasing live, on-going, and planned projects.
- Files:
projects/models.py,projects/views.py,projects/urls.py,projects/admin.py - Templates:
templates/projects/list.html,templates/projects/detail.html - Routes:
/projects/,/projects/<slug>/ - Features: Status filtering (live/on-going/planned), project images, GitHub/live URLs, technologies tags
- Added
MEDIA_ROOTto settings for image uploads - Created Blog app for publishing blog posts with markdown support.
- Files:
blog/models.py,blog/views.py,blog/urls.py,blog/admin.py - Templates:
templates/blog/list.html,templates/blog/detail.html - Routes:
/blog/,/blog/<slug>/ - Features: Draft/Published status, tag filtering, related posts, markdown content rendering
- Added test data management commands.
- Files:
projects/management/commands/load_test_projects.py,blog/management/commands/load_test_blog_posts.py - Commands:
python manage.py load_test_projects,python manage.py load_test_blog_posts - Both support
--clearflag to remove existing data - Added blog and projects links to navigation menu.
- Files:
templates/base.html
Changed
- Updated all page templates to use viewport height properly.
- Changed from fixed height (
md:h-[calc(100vh-5rem)]) to minimum height (md:min-h-[calc(100vh-5rem)]) - Files: All templates in
templates/core/andtemplates/projects/ - Allows content to expand beyond viewport without overflow issues
- Improved scrolling behavior across all pages.
- Main container handles all scrolling (single scrollbar)
- Child divs grow naturally without their own scrollbars
- Files: All page templates
- Enhanced blog post detail page with markdown rendering.
- Files:
blog/views.py,templates/blog/detail.html - Converts markdown content to HTML with proper styling
- Supports headings, code blocks, lists, tables, links, and more
[0.2.0] - 2025-11-12
Added
- Added About page with skills, experience, and interests section.
- Files:
core/views.py,core/urls.py,templates/core/about.html - Route:
/about/ - Added Contact page with contact form and alternative contact methods.
- Files:
core/views.py,core/urls.py,templates/core/contact.html - Route:
/contact/ - Added Changelog page that dynamically displays CHANGELOG.md content.
- Files:
core/views.py,core/urls.py,templates/core/changelog.html - Route:
/changelog/ - Added
markdownlibrary torequirements.txtfor markdown parsing - Added fixed navigation menu to base template with links to all pages.
- Files:
templates/base.html - Includes active page highlighting
- Added CSS animations for blinking cursor and typing effects.
- Files:
static/css/input.css - Rebuilt CSS output with new animations
- Updated all page templates to account for fixed navigation bar spacing.
- Files:
templates/core/home.html,templates/core/about.html,templates/core/contact.html
Changed
- Updated home page to remove static text from terminal prompt footer.
- Files:
templates/core/home.html
[0.1.0] - 2025-10-31
Added
- Add Tailwind + base layout; integrated Tailwind build pipeline.
- Files:
templates/base.html,tailwind.config.js,package.json - No DB migrations.
user@portfolio
~
$
_