FastSM Changelog
================

0.5.0

New Features:
- Add language selection for posts - choose language when posting (default in account options)
- Add Windows installer option - installer or portable zip available in releases
- Add "Insert Placeholder..." buttons to all template fields in options
- Add pin/unpin and delete buttons to View Post dialog (for your own posts)
- Add mention earcon - plays when navigating to a post that mentions you
- Add soundpack converter script in the git repo for TweeseCake and TWBlue soundpack formats
- Add per-timeline streaming support for lists, local, federated, and hashtag timelines
- Add View Instance option (Alt+I in window, Ctrl+Win+Alt+I invisible interface)
  - Shows instance name, description, version, stats, rules, contact info
  - Shows server limits: max characters, media limits, poll settings
  - Automatically detects remote instance when viewing instance/remote user timelines
- Add option to include/exclude link preview card text in posts (Templates settings)
- Add ability to report users and posts (user viewer, post view, context menus)
  - Rule violations show server rules as checklist to select specific violations
  - Thread posts can be multi-selected to include in report (Mastodon)
- Show Edit option in post context menu when you can edit the post

Improvements:
- Improve notification template - now properly supports $type$ and other variables
- Improve user autocomplete - now works with word at cursor, no @ required
- Improve find functionality - F3/Shift+F3, no wrap, better feedback
- Improve scheduled posts timeline
- Use plaintext content from fediverse posts when available (Misskey, Iceshrimp, Akkoma, etc.)
  - Checks _misskey_content, source.content, and text fields before falling back to HTML stripping
- Apply max_usernames_display setting to mentions in notifications
- Preserve position when refreshing conversation timelines
- Use follow/unfollow sounds for accept/reject follow requests
- Skip mention earcon in mentions timeline (redundant)
- Rename send_tweet sound to send_post
- Autocomplete now only triggers on @usernames and adds space after
- Preserve newlines in user bios in profile viewer
- Remove 'No more posts' speech when loading previous
- Auto-updater detects installed vs portable and uses appropriate update method

Bug Fixes:
- Fix quoting broken due to missing language parameter
- Fix editing broken due to missing language parameter
- Fix quote post template in notifications showing "Re: URL" instead of proper format
- Fix bookmarks/favorites only loading 40 posts - now properly paginates
- Fix Cmd+Q not closing FastSM on Mac
- Fix boost/favorite state mismatch between View Post dialog and context menus
- Fix errors.log being created in app folder instead of config directory
- Fix updater failing with apostrophes in folder path
- Fix global hotkeys causing issues on macOS - now disabled
- Fix macOS crashes from Raise() calls on destroyed windows
- Fix Mac crash when timeline fails to load - GUI updates now thread-safe
- Fix Mac crash from speech in background threads - now routes to main thread
- Fix crash when using "Load posts here" with filtered timeline
- Fix refreshing conversation timelines throwing 'func' attribute error
- Fix Bluesky reply not recognizing mentioned users when post fetch delayed
- Fix Bluesky mentions appearing in notifications - now respects setting
- Fix mentions appearing in notifications from cache - now filtered when loading
- Fix polls from cache having no options - now refreshes from API before voting
- Fix Bluesky posts showing wrong time in Sent timeline - use UTC
- Fix YouTube playback on macOS - yt-dlp detected without VLC
- Fix conversation timeline not focusing on source post when opened
- Fix blank posts when plaintext fields exist but are empty/whitespace
- Fix user/sent timelines pulling old posts after refresh when pinned posts present
- Fix server-side filters with "hide" action showing posts as CW instead of hiding
- Fix View Instance in remote user timelines
- Fix dialog focus after Windows+D minimize/restore
- Fix account creation dialog bugs
- Fix confirm_delete setting not honored in View Post dialog delete button
- Fix multiple audio streams playing when spamming play button
- Disable VLC entirely on macOS - was causing crashes

0.4.1
Reimplement VLC less intrusively this time.
Unfortunately, I had to remove the timeline gaps feature. It was very broken. May revisit at some point.
Add user aliases. Rename users' display names for quicker reading.
Fix boosting/favoriting boost posts.
Show view poll results on poll ended notifications.
Properly clean up db when disabling caching and clearing cache.
Fixes to reverse timelines.
Update sent timeline on send of post.
Add bookmark toggle to actions menu.
Change shortcut key of block to control shift B, and add control B for bookmarking.
Increase cache max limit from 5000 to 10000
Fix poll earcon not playing - Polls weren't being serialized to cache correctly (nested PollOption objects)
Fix boosted images not playing earcon - Media attachments from cache (dicts) weren't being detected properly
Fix streaming connecting multiple times - Was causing duplicate posts; added stream lock to prevent race condition
Fix "handle_stream" repeated errors - Added to transient errors list
Fix list corruption when posts are deleted - Index wasn't being adjusted when posts were removed via streaming or manual delete
Fix Bluesky posts showing blank - Posts with only external link embeds (no text) now show the link title/description
Fix URL ordering in Open URL dialog - Text/link URLs now appear before media attachment URLs
Fix copy not including media descriptions - When copying directly (not through process_status)
Fix some Mac related issues.
Fixes for scheduled posts timeline.
Fix Mac crash after timeline load - streaming callbacks now properly use main thread for timeline modifications
Fix bookmarks/favorites timelines not updating - additional safeguards to ensure since_id is never used
Fix direct message reply playing wrong sound - now correctly plays DM sound instead of reply sound
Auto updater now shuts down cleanly, saving positions and cache before restarting
Link previews now show URL when title and description are empty
Fix Bluesky post dialog not closing - when post succeeds but fetch fails due to indexing delay, create minimal status for proper handling
Fix Bluesky delete not working - now uses platform backend instead of Mastodon API

0.4.0

Timeline Caching
FastSM now caches timeline data to disk for much faster startup. When you launch the app, your timelines will load instantly from cache, then refresh from the server in the background. This means you can start reading your timeline immediately without waiting for network requests.

- Timeline caching is enabled by default and can be disabled in Advanced options
- Configurable cache limit per timeline (default 1000 items, max 5000)
- Clear all caches button shows total cache size and triggers a full refresh
- Cached timelines: home, mentions, notifications, favourites, bookmarks, user timelines, lists, search, feeds, local, federated, instance, remote user, pinned

Timeline Gap Detection
When there are more new posts than can be fetched in one API call, FastSM now detects and tracks these gaps. This works on any refresh - including after sleep/hibernate when many posts may have accumulated. When you load previous posts, it will fill in gaps first before loading older content. Gap state persists across app restarts.

Position Restore Improvements
- All cached timelines now save and restore position by post ID (not just index)
- Position is correctly maintained even when new posts arrive during background refresh
- Notifications and mentions timelines continue to use the existing ID-based position restore

Options Dialog Reorganization
The options dialog has been reorganized into more logical tabs:
- New Timelines tab: Ask before dismissing, reverse timelines, sync home timeline position, and all timeline caching settings
- New Audio tab: Sound settings for media, navigation, and errors, plus audio output device selection
- New YouTube tab: yt-dlp path, cookies file, and Deno path settings
- New Invisible Interface tab (Windows only): All invisible interface settings and keymap selection
- Templates tab now includes demojify display names and 24-hour time settings
- Advanced tab simplified to contain only API and general app settings

Bug Fixes
- Fix audio device enumeration error ("cannot import name 'bass_module'")

0.3.3
Remove VLC, use sound_lib exclusively for all audio playback (with yt-dlp for YouTube/Twitter extraction)
Add audio output device selection in Global Options > Audio tab
Add "your posts" and "your replies" client-side filters
Add option to include/exclude image descriptions in post text (Templates tab)
Add Hide Window menu item (Ctrl+Shift+W)
Add option to use Ctrl+Enter to send posts instead of Enter
Add link in Bluesky login dialog explaining how to create an app password
Add Windows 11 keymap prompt when enabling invisible interface on Windows 11
Show user relationship status (follows you, blocked, muted) in profile view
Allow opening multiple user timelines for the same user
Fix Bluesky media not showing on boosted/quoted posts
Fix Bluesky URL handling for media and links
Fix emoji removal to also handle Mastodon-style :shortcode: custom emojis
Fix speak.py to use speak and braille separately for better screen reader compatibility
Don't play new items sound when all new items are filtered out
Fix mute conversation in mentions timeline
Fix auto updater download
Fix word wrap in other edit fields where it didn't apply
Change open post URL option to view post on the web
Use wx instance checking to prevent multiple instances of the app running
Add delete post, bookmark, and unbookmark to the confirmations tab
Add soundpack debugging/logging for troubleshooting missing soundpacks
More resiliency when Mastodon servers go offline

0.3.2
Add timeline reordering for built-in timelines
Fix autoupdater

0.3.1
Add autoupdater.
Add account creation to the app, both for Bluesky and Mastodon!
Add media playback with VLC, if found. Use sound_lib as fallback. This means youtube will now play.
Add new download yt-dlp and download VLC buttons to the advanced tab of the global options dialog.
The notifications and mentions timelines now save their position on exit and restore it if the post still exists in the timeline the next time you launch the app. This unlike the home timeline sync is local only and doesn't sync with any kind of API.
Fix an issue with line breaks in the notifications buffer.
Add prompt to follow FastSM's support/updates account on new account auth.
Fix mute conversation option.
More work on search, still apparently inoperable?
More extensive support for server filters. Show warnings for those types of posts, don't let editing filters duplicate keywords.
Redesigns poll creation dialog to be more in line with Mastodon poll creation.
Show time remaining in a poll if you view results.
More consistent behavior in the conversations buffer. Replying will reply to the last message in the conversation. Send new message will open the other new message dialog as before.
You can now launch more than one conversation buffer at a time.
Fix accepting/rejecting follower requests.
Add some more keyboard shortcuts to the audio player. E/R/T, speak elapsed/remaining/total time.
Add more confirmations to the confirmations tab
View dialog improvements. Add view edit history, view boosters, view favoriters, view quotes. Also add quote count to the details edit.
View image now appears at the top of context menus.
Image viewer now works for boosted posts.
Profile editor with fields is fixed.
Demojify is fixed to not remove accented characters from display names.
Bookmarks/favorites timelines properly restore on restart.
Improvements to audio playback and URL opening.
Sound now works on Mac.
A bunch of keyboard stuff is fixed on Mac.
Fix spaces being removed after punctuation in notifications and other text. HTML block elements like paragraphs are now properly converted with spaces between them.

0.3.0

Improved image viewer
The app now includes a much better, and actually working, image viewer, which replaces the image viewer which would appear when you press view image in the view post dialog with an image in the post. The new image viewer provides the ability to see all images in a post, as well as get AI image descriptions (see below).

AI image descriptions
You can now get AI descriptions for images in posts. Workflow: first, set up your GPT/Gemini API key, whichever one/ones you want to use, in the AI tab of the settings dialog. Set the service and model you wish to use in the combo box, and tweak the prompt to your liking. Next, on a post with an image, you can view the image/images in the post in a few different ways. The easiest is through the context menu/view image. Other ways include the view post dialog, or the global shortcut, control win alt V by default. Next, you are put in a dialog containing all of the images in the post, which you can move between with the arrows. On each image, there is an edit field with the current description of the image, if one is provided. If you tab, you will eventually find a get AI description button, which when pressed, will kick off the process of getting the AI description. This process may take a bit, depending on your model and service combination. It will then replace the description with the provided AI description.

Mac
FastSM has been able to run on Mac from source for a bit, but this is the first version of FastSM to provide a working, runnable MacOS build.

Audio Player
FastSM now has an audio player, in addition to just playing audio in audio posts. The audio player can be called up by pressing control shift A in the main window, or control win shift A in the invisible interface. In the audio player, you can press up and down arrows to change media volume, as well as left/right to seek. The media volume persists between audio files.
In addition to all of this, the audio player has two settings. One to have the audio player automatically come up when audio starts playing, and another to stop audio from playing when the audio player is closed.

Other audio improvements
You can now set a per account soundpack volume. You can either do this by adjusting the volume in the normal way, and it will only now adjust for the focused account, or you can use the new soundpack volume slider in the account options dialog.

Dark Mode
Add a very hacky/experimental dark mode support in the advanced tab of the app.

Spell Check
It is now possible to check spelling on a post or reply you are writing, with the new spell check button in the new post dialog.

Confirmations
It is now possible to enable confirmations for different toggle actions. For example, you may want a confirmation when you unfollow someone, so that you don't do it accidentally. In the program options dialog, there is now a new confirmations tab where you can enable individual confirmations for things such as favorite, unfavorite, boost, unboost, follow, unfollow.

Other additions/bugfixes
Add enable/disable notifications buttons in the user viewer dialog. This will make Mastodon send a notification to your notifications buffer every time a user with notifications enabled posts.
Add a feature where you can have the app only use a single API call on initial timeline loads.
Add a global shortcut for the update profile option, control win shift U.
Fix quoting. Quoting now works correctly in all cases.
Fix a bug where media descriptions did not show for boosted posts.
Fix a bug where you couldn't unschedule a scheduled post from the scheduled posts timeline.
Fix a bug which meant you couldn't call up the scheduled posts timeline.
Fix the title of conversation buffers when you load a conversation from a boosted post.
Fix deleting bookmarks.
Fix bugs with user selection when loading timelines/profiles.
Fix search timeline errors.
Fix pinned sound in user timelines.
Fix a 404 error when loading user timelines on app startup.
Fix various visual issues with the app.

0.2.2
-----

Bug Fixes:

* Fixed conversation view for boosted posts - now shows replies to the original post, not the boost wrapper
* Fixed favorite/boost state not syncing across buffers - state now updates in all timelines where the post appears
* Fixed template variables in post text being interpreted - $text$ patterns in posts no longer get expanded
* Fixed notification text truncation - removed 280 character limit, full text now shown
* View Image button now only enabled for posts with actual image attachments (not video/audio/gifv)

New Features:

* Direct message sound support
  - Mentions with visibility "direct" now play the "messages" sound instead of "mentions"
  - When mentions timeline is hidden and a mention arrives in notifications, plays appropriate sound (mentions or messages)

0.2.1
-----

Bug Fixes:

* Bluesky notifications: like/repost notifications now show the actual post content
  - Fixed by batch-fetching posts via reasonSubject URI
* User interactions now work from Bluesky notifications
  - Follow, mute, block, view profile, and user timeline actions work on notification actors
  - Relationship checking is now platform-agnostic (Mastodon uses account_relationships, Bluesky uses viewer)
* Fixed follow/unfollow/block/unblock using user ID instead of handle
  - All user interaction methods now properly use user.id (DID for Bluesky, numeric ID for Mastodon)
  - Fixes "Invalid Record Key" errors on Bluesky when unfollowing
* Timeline position syncing fixes
  - Fixed invisible interface sync using wx.CallAfter for thread safety
  - Fixed Mastodon marker API call signature (markers_set)
  - Position now syncs to server on app close
* Soundpack setting now properly saves between restarts
* Quote posts now properly verify quote attachment before reporting success
  - Falls back to URL inclusion if native quoting not supported

New Features:

* Notification viewer dialog - View notifications with dedicated viewer showing notification type, user info, and post content
* Improved HTML to text conversion for post editing - preserves newlines and full mentions
* Conversations can now be copied with Ctrl+C
* Edit post now works from notifications

0.2.0
-----

New Features:

* Earcon sounds system improvements
  - New image.ogg sound for posts with image attachments
  - New poll.ogg sound for posts with polls
  - New pinned.ogg sound for pinned posts
  - New notification.ogg sound when notifications arrive
  - Sounds now play concurrently (no longer cut each other off)
  - Image attachments play image.ogg, video/audio/gifv play media.ogg

* Hashtag support (Mastodon)
  - Follow/unfollow hashtags from context menu
  - View and manage followed hashtags from Application menu

* Explore/Discover dialog (Ctrl+Shift+X)
  - Mastodon: Discover Users, Trending Posts, Trending Tags, Trending Links
  - Bluesky: Suggested Users, Suggested Feeds, Popular Feeds

* Keymap system with inheritance
  - Custom keymaps can be placed in user config keymaps/ folder
  - Keys not defined in custom keymap inherit from default
  - Keymap selection in Advanced options

* User viewer improvements
  - Mute/unmute and block/unblock buttons
  - Show/Hide Boosts toggle (Mastodon only)
  - List Blocked Users and List Muted Users in Application menu

* Poll support
  - View poll options and results in post text
  - Vote on polls via context menu

* Content warning support
  - Three modes: hide (show CW only), show (CW + text), ignore (text only)
  - Configurable in options

* Server filters dialog (Mastodon)
  - View and manage server-side content filters

* Timeline filtering
  - Filter timelines by user or text
  - Save and restore filter settings
  - Find in timeline (F3)

* Context menu on posts (right-click or keyboard shortcut)
  - Context-aware options based on post content and platform

* Mute/unmute conversation (Mastodon)
  - Mute notifications for a thread you're participating in
  - Available in context menu on posts

* Account switching hotkeys

Bluesky Improvements:

* Support for listing blocked/muted users
* Pinning and unpinning posts
* Custom timeline persistence
* Suggested users and feeds in Explore dialog

Mac Compatibility:

* Fixed keyboard shortcuts and accelerators
* Fixed modal dialog focus issues
* Fixed menu dimming after dialogs close
* Fixed OAuth URL opening
* Fixed sounds path for running from source
* Option+M for context menu

Bug Fixes:

* Fixed invisible mode not playing new earcon sounds
* Fixed search timeline error with unexpected 'limit' keyword argument
* Fixed error log path for compiled PyInstaller builds
* Fixed soundpacks list showing hidden files
* Fixed explore dialog follow button
* Fixed mentions_in_notifications not applying on startup
* Fixed soundpan slider float/int conversion
* Fixed opening URLs in boosted/reblogged posts
* Fixed copy to clipboard for boosts using wrong template
* Fixed timeline filter using wrong attribute
* Fixed conversation loading for mentions
* Fixed streaming resilience to transient errors
* Fixed slow startup caused by large user cache files
* Removed soundpack copying to user config (redundant)

Performance:

* User cache now in-memory only (no disk persistence)
* Display cache for custom timelines
* Pre-import atproto in background thread
* More resilient streaming with better error handling


0.1.0
-----
First initial version
