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