/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.1 dependency
  • 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.0 dependency
  • 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 psutil dependency 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 escapejs filter
  • 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 views and likes fields to BlogPost model
    • Created Comment model with name, email, content, and approval status
    • Created PostLike model to track likes and prevent duplicates per session
  • Views:
    • Enhanced blog_detail view to track views, handle comment submissions, and check like status
    • Added like_post AJAX endpoint for real-time like updates without page refresh
  • Admin:
    • Added views and likes to blog post list display
    • Registered Comment and PostLike models with admin interface
    • Comments can be approved/rejected from admin panel
  • 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 UserProfile model with OneToOne relationship to CustomUser
    • Added signals to auto-create profiles for new users
    • Signals moved to separate signals.py file for better code organization
  • Views:
    • Added profile view with @login_required decorator
    • View uses get_or_create to ensure profile exists for existing users
  • Admin:
    • Registered UserProfile model in admin interface
    • Added list display, filters, and search functionality
  • 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_EMAIL which 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.py to dedicated signals.py file
  • Added ready() method to CoreConfig to 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 .env file
  • Updated login redirect to send users to profile page.
  • Files: config/settings.py
  • Changed LOGIN_REDIRECT_URL from / 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 --clear flag 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 --clear flag 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 .env variables for DEFAULT_FROM_EMAIL, REPLY_TO_EMAIL, and EMAIL_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_ROOT to 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 --clear flag 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/ and templates/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 markdown library to requirements.txt for 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 ~ $ _