Changelog

Latest updates and improvements to PluggedTime.

27 October 2026

Hidden profiles in Django admin

  • Staff can now browse and search viewer-hidden user pairs in the Django admin under Accounts

26 October 2026

Hide a profile from your feeds

  • Every profile now has a "Hide in feed" button that stops that user's posts from appearing in your Global and Following feeds
  • Their profile and posts stay visible when you visit them directly, and hiding never affects what other users see
  • Hiding is stored per viewer in the new HiddenProfile model and applied as a single exclusion in the feed query, keeping the feeds fast
  • Account settings now link to a "Hiding posts in feed" list where you can see everyone you've hidden and show them again

25 October 2026

Anonymized backup sync for the development VPS

  • Every daily backup now also produces an anonymized copy (emails and passwords scrubbed) stored alongside the original backups
  • The development environment can now sync only those anonymized backups through a dedicated read-only account, keeping the rest of the server off-limits
  • Restoring a synced anonymized backup into the local stack is now a single command with a confirmation step

24 October 2026

Streak calculation fixes

  • Restored the 36-hour gap threshold between consecutive streak sessions, which had silently dropped back to 24 hours
  • A streak now resets when the last session ended more than 36 hours ago, so inactive days no longer count toward it
  • Streak days now follow your profile timezone instead of UTC

23 October 2026

Group chat now runs on server-sent events

  • The group chat no longer needs a separate WebSocket server: messages stream directly from the web application, which keeps history replay and live delivery just as instant
  • Chat connections now reconnect automatically, picking up exactly the messages you missed while away
  • With the chat migrated, the platform's last Redis dependency is gone: the whole stack now runs on PostgreSQL alone

23 October 2026

Background jobs now run on a database queue

  • Background work now runs through a task queue backed by the existing database, so the platform no longer needs Redis for scheduled jobs
  • The hourly maintenance jobs (stopping idle running sessions and processing Buy Me a Coffee webhooks) keep running as before and still respect their admin switches
  • Finished task results clean up after themselves: successful runs are removed after 7 days and failed ones (with their error details) after 30 days

23 October 2026

Welcome email on signup

  • New accounts now receive a welcome email with a quick overview of what PluggedTime has to offer
  • The email is purely informational: no confirmation link and no extra steps before you can start tracking

23 October 2026

Password reset links expire after 3 days

  • Recovery emails now state that the reset link expires in 3 days, matching the configured reset window
  • Links past the window are rejected with a prompt to request a new one

23 October 2026

Password recovery from the settings page

  • The settings page now has a "Recover password by email" action that emails a reset link to your account's address without asking for it
  • The confirmation shows the destination semi-censored, like ex*****@g****.c**

23 October 2026

Email on Django 6.1 mailers

  • Migrated the email configuration from the deprecated EMAIL_* settings to Django 6.1's MAILERS setting
  • Development sends every email to Mailpit, while production selects its SMTP server (Gmail-ready) through the MAILER_* environment variables
  • Added the SERVER_EMAIL setting and documented the email setup in the environment reference and the development guide

22 October 2026

Fixed the Following tab dropping its filter

  • Changing post type or order on the Following tab no longer switches the results to the whole feed: the tab keeps showing posts from pluggers you follow

22 October 2026

Posts you follow filter is back

  • The Global and Following feed filters re-gain a "Posts I follow" checkbox that shows only posts you follow
  • It combines with the other filters and sticks through pagination

22 October 2026

Global and Following feed tabs

  • The index feed is now two tabs: "Global" shows every visible post, and the new "Following" tab shows posts from pluggers you follow
  • Both tabs share the same composer, filters, and Load More, and the old "posts you follow" checkbox is no longer shown in the feed
  • When your Following tab is empty, it points you to the Global feed or to find pluggers to follow

22 October 2026

Follow other pluggers

  • Profile pages now have a Follow button and show how many pluggers someone follows and is followed by
  • Following is enforced server-side with privacy checks, so private profiles cannot be followed and only you can follow from your own account
  • Follow notifications and the "Following" feed tab are coming next

22 October 2026

Fixed the "filter users without sessions" search

  • Fixed the user search filter that errored after the session model rename: the filter now uses the new session relation instead of the removed one
  • Covered the filter with tests, including users with running sessions

22 October 2026

Retired the legacy session timeline

  • Removed the legacy Event-timeline edit path (the session service, the session-owner decorator, and their manager helpers) now that the persisted session model powers the whole runtime
  • Kept the Event timeline as an import-only source behind the idempotent import command
  • Removed the unused "Include adjacent sessions" filter from the sessions page

21 October 2026

Resume a session from the toy drawer

  • Added a "Resume" item to the toy drawer when you have no running session but a resumable one, styled like a toy list entry with the session's toy image
  • Resuming refreshes the drawer and session tables just like a toy change
  • Distinguished resume conflicts (409) from sessions that simply cannot be resumed (422)

Late September 2026

Session editing on the new model

  • Reworked session edit, update, and delete flows to operate on the new persisted session model
  • Added a resume method so the latest closed session can be re-opened
  • Fixed editing a session timestamp losing sub-minute precision
  • Preserved timespan precision to the minute and validated timespans before saving

Mid September 2026

Unified session model

  • Introduced the persisted session model with a dedicated query manager that the runtime now consumes
  • Migrated non-stop duration, running-session detection, toy retrieval, and user views to the new model
  • Removed StartEvent and EndEvent models, admin entries, and related legacy code

31 August 2026

Achievements

  • Added a new gamification app with global, date-bounded achievement rules
  • Achievement progress derives from tracked session time, with per-user completion shown in admin
  • Added a user achievements view and a utility plus command to create monthly average goals

Late August 2026

Global usage statistics

  • Added global usage totals and per-month breakdowns to the dashboard stats tab
  • Added a monthly trends table with active users, average daily usage, and usage-trend comparisons
  • Cached stats data and improved session count accuracy

Code cleanup

  • Removed the legacy tracker app and unused models, files, and environment settings

24 August 2026

Session duration accuracy

  • Fixed profile non-stop duration so it is only shown while a session is actively running
  • Removed legacy session-tracking code to improve the reliability of session history and statistics

23 August 2026

Session tracking and statistics

  • Introduced a unified session event model for more consistent session history and statistics

Chat reliability

  • Added connection status feedback and disabled message controls until chat is ready
  • Improved WebSocket cleanup when switching tabs and handling unavailable connections
  • Invalid or empty messages are now safely ignored

13 August 2026

Monitoring

  • Improved error monitoring by ignoring expected invalid-host requests

11 August 2026

Analytics

  • Added self-hosted Umami analytics for privacy-conscious usage insights

4 July 2026

User search

  • Added an option to filter search results to users with profile images

3 July 2026

Profile privacy controls

  • Added profile visibility modes: Public, Registered, and Private
  • Restricted profile pages, profile tabs, feed content, and related partials based on visibility rules
  • Replaced hidden 404 responses with dedicated non-accessible pages that include Log in and Register links

Active users index options

  • Added opt-in controls for public and private active user index lists
  • Applied opt-in filtering to both active user list and active user counters
  • Updated dashboard wording from "index" to "active" where appropriate for clarity

Account settings and registration

  • Added visibility and index opt-in controls to account management
  • Added the same visibility options to registration with conditional checkbox display
  • Improved visibility option descriptions to explain each mode and index opt-in behavior

28 June 2026

Feed improvements

  • Improved feed loading by reducing repeated post, like, reply, profile, and toy-session lookups
  • Prevented accidental duplicate text, image, reply, and event posts from fast repeated submissions
  • Fixed image replies so the image upload form opens correctly from post detail pages

Stats accuracy

  • Corrected lifetime usage totals when users switch toys before ending the previous session
  • Average session duration and daily usage now cap sessions at the next start, next end, or current time

Supporters

  • Added supporter status integration with automatic webhook processing
  • Supporters can also be added manually by administrators
  • Supporter badges and tooltips now appear on profiles and community views

16 June 2026

Session list improvements

  • Session list now shows user profile images instead of plain text
  • Added direct link to plug a toy from the session list
  • Toy information displayed in tooltip on user search and feed posts

Streak calculation

  • Increased consecutive days gap threshold to 36 hours for more lenient streak tracking

Image display improvements

  • Profile and avatar slots can now show blurred text fallbacks when no image is available
  • Image blur strength is now consistent across image sizes, including smaller avatar thumbnails
  • Centralized the image display component so avatars and session list entries behave the same way everywhere

2 June 2026

Toy management

  • Prevented users from removing a toy that is currently in use
  • "None" button in toy drawer only appears when a toy is actively running
  • Removed unnecessary page refresh after toy changes

UI polish

  • Web title now displays in a single line

1 June 2026

Toy drawer

  • New toy drawer in the navbar for quick toy switching without leaving the page
  • Active toy icon indicator in the navigation bar
  • Toy menu automatically refreshes when adding or removing toys
  • Fixed add toy link in the drawer

26 May 2026

Enhanced session statistics

  • Added non-stop duration tracking to session list
  • Added average daily usage, average session duration, and total time stats
  • Added monthly usage comparison and total toy insertions count
  • Session list ordered by non-stop duration

Session list redesign

  • Migrated session list from table layout to collapsible cards
  • Each user card expands to show detailed statistics
  • Configurable gap duration for streak calculations

21 May 2026

User search and registration fixes

  • Fixed user search functionality and improved search accuracy
  • Prevented users from registering with usernames of deleted accounts

17 May 2026

Event posts engagement

  • Users can now like and comment on event posts, enabling social engagement on timeline events

Enhanced profile statistics

  • Added monthly average statistics to provide better usage insights
  • Improved timesince display for more human-readable timestamps
  • Fixed toys owned count calculation

Code improvements and cleanup

  • Removed default toy assignment logic for cleaner session tracking
  • Extracted and reorganized statistics code for better maintainability
  • Added pagination URL generation utility
  • Removed deprecated profile properties and database migrations

15 May 2026

Session and profile fixes

  • Fixed session deletion flow in "My Sessions" so deleted entries refresh correctly
  • Updated toy list thumbnails in "My Sessions" to use optimized thumbnail images

UI and readability improvements

  • Added a loading state when switching dashboard tabs and when navigating tab history
  • Improved long-word wrapping in feed posts to prevent layout overflow
  • Adjusted dashboard session table header colors for better theme consistency

14 May 2026

Profile stats enhancements

  • Added "Avg. session duration" stat — average time per session
  • Added "Avg. daily usage" stat — average daily usage since first toy usage
  • Improved variable naming for better template maintainability

Profile view fixes

  • Fixed anonymous visitors seeing HTMX navbar requests for authenticated content
  • Corrected template context shadowing bug that broke navbar authentication checks
  • Removed redundant database query in profile view

10 May 2026

HTMX-powered tabs

  • Tabs across the app now load content on demand instead of rendering all tabs at once
  • Dashboard, profile, and toy detail pages all use the new tab system
  • Browser back/forward buttons navigate between tabs correctly
  • Tab state is preserved in the URL via query parameters (?tab=, ?page=)
  • Sharing a URL with tab parameters opens directly to that tab

Feed pagination

  • Feed on the dashboard and profile pages now uses page-number pagination
  • Current page position is tracked in the URL for easy sharing and navigation

Chat improvements

  • Chat now fills the full available screen height and scrolls to the latest messages
  • Switching away from the chat tab properly closes the connection

Profile stats

  • User profiles now show "Last user activity" with a human-readable timestamp
  • Fixed toys owned count to only include DIY toys that are also owned by the user

Static assets

  • Switched to compressed manifest-based static file storage to avoid browser cache issues

9 May 2026

Navigation drawer

  • Replaced the dropdown user menu with a right-side drawer for easier navigation
  • Navigation menu is now accessible to all visitors, not just logged-in users
  • Anonymous visitors can browse toys, search users, and access the changelog

User search improvements

  • Added pagination to the user search results
  • Added sorting options (by username, last activity)
  • Faster search with improved debounce timing

Running session indicators

  • Users with an active session now show a live indicator on their profile and in search results
  • Running session advice displayed on user profiles
  • Indicator tooltip shows additional context

Image thumbnails

  • Thumbnails now properly fit the specified dimensions instead of stretching

8 May 2026

Dependencies update

  • Updated all Python dependencies to their latest versions
  • Updated CI/CD GitHub Actions packages
  • Applied code formatting with Ruff

8 April 2026

Security improvements

  • Added HTML sanitization (nh3) to protect against XSS in user-submitted content
  • Improved security settings and vulnerability fixes
  • Added exception capturing in models for better error tracking

Infrastructure

  • Switched WebSocket channels backend to Redis for improved reliability
  • Moved browser reload middleware to debug-only

7 April 2026

Redis caching

  • Added Redis as a caching layer for faster page loads
  • Improved performance on the dashboard (active sessions), feed, user search, and toy search

Code cleanup

  • Removed deprecated stats app and unused legacy code
  • Consolidated text utilities into the shared utils module
  • Cleaned up unused imports, template tags, and shell commands

2 April 2026

Structured error handling

  • Unified error response format across the entire application
  • Errors now show field names and error codes for clearer feedback
  • Added request correlation IDs for easier debugging and support
  • Frontend error modal updated to display structured messages
  • Fixed a bug where duplicate timestamp errors were silently ignored

1 April 2026

Timeline events

  • New event posts in the feed: users can create timeline events tied to their active session
  • Event creation requires an active session with a toy — disabled otherwise
  • Event types dropdown auto-reloads when starting or stopping a session
  • Full CRUD support: create, edit timestamp, and delete event posts
  • Comprehensive test suite (13 tests) for active session validation

31 March 2026

Improved image blur

  • Reworked the NSFW image blur system using Alpine.js for smoother toggling
  • Blur toggle now works consistently across all pages (feed, search, toys, profiles)
  • Non-logged-in users can now toggle blur on images
  • Centralized blur component for easier maintenance

Toy at timestamp

  • New service that finds which toy a user was using at any given moment
  • Feed posts now show the toy being used when the post was created
  • 11 new tests covering all edge cases (paused sessions, multiple toys, etc.)

29 March 2026

Post following

  • Added a management command to create following relations for existing posts

24 March 2026

Feed refactor

  • Extracted reusable feed components (post card, empty state, load more button)
  • Eliminated duplicated template code across feed views
  • Added dedicated JavaScript for feed form interactions

User profile feed

  • User profiles now show their feed posts in a dedicated tab

23 March 2026

Edit text posts

  • Users can now edit their text posts after publishing
  • Added text formatting support with mention parsing

Show NSFW

Nov. 2, 2026, 7:55 a.m.
Choose a toy