LeaseySocial Proof of Concept Notes for Beta Review.

This document describes the current Mastodon proof of concept for LeaseySocial.

It is not final user documentation. It is intended for beta testers and reviewers who already understand Mastodon reasonably well and who can advise whether the current feature set is moving in the right direction.

The main objective of LeaseySocial is simple: To provide a fast, keyboard-friendly, JAWS-friendly Windows desktop client for Mastodon. Bluesky may be considered later, but the present proof of concept is focused on Mastodon. The app does not attempt to reproduce large multi-service clients or every function of other social media applications. The aim is to make the core Mastodon experience practical and efficient for blind users, especially those using JAWS and, where possible, Braille.

General Layout.

The main LeaseySocial window is deliberately simple.

It contains:

If only one Mastodon account is configured, the Accounts list is hidden. The layout then starts with the Timelines list and the Posts list. The concept here is that all your accounts are laid out in front of you. You do not have to invoke any menus or special dialogs to switch accounts. You should just be able to flick between them.

The information in each row is built from configurable fields.

The default fields are:

As you move through the list with Up and Down Arrow, JAWS reads the row. Left and Right Arrow move between the configured fields and speak the selected field. This allows a user to hear just the author, just the post text, just the date, just the client used or the status such as Public, Followers only or Direct message.

The order of these fields, and whether they are included at all, is controlled in Options on the Columns tab. This is account-specific.

There is also a context menu which contains the main commands. The most common actions are listed directly in the menu, and less frequent actions are placed under More Actions.

Accounts.

LeaseySocial supports multiple Mastodon accounts.

If one account is present, the main window behaves as a single-account client.

If two or more accounts are present, an Accounts list appears before the Timelines list. Move to the Accounts list with Shift+Tab from the Timelines list. Use Up and Down Arrow to choose an account.

When an account is selected, the Timelines list changes to show the timelines configured for that account.

All configured accounts are streamed while the app is running. This means you can receive new posts, mentions and notifications from more than one account.

When a new item is spoken for a non-current account, the account name is included first so you know which account received it. This also applies if you are focused away from the application.

Example:

brian_hartgen. New mention from Team-FM: ...

Manage Accounts is available from Options, Control+Comma.

The Manage Accounts dialog lets you:

If you delete an account, you are asked to confirm.

The account login process opens the Mastodon authorisation page in the browser. After authorising the app, you paste the code into LeaseySocial.

Timelines.

The core timelines are:

Other timelines can include:

Control+1 moves to the first timeline. Control+2 moves to the second timeline. Control+3 moves to the third timeline.

The exact timeline reached by these commands depends on the timeline order configured in Options.

Control+W closes a temporary or custom timeline. You are asked to confirm.

Temporary timelines, such as user timelines, searches, list timelines and instance timelines, can persist across sessions if they remain in the Timelines list.

The app remembers your position in each timeline where possible. If you close the app and restart it, or move from one timeline to another and back again, it should try to restore the same post provided that post is still present in the loaded set.

The app currently loads up to 100 posts for most timelines.

Timeline Order and Timeline Management.

Open Options with Control+Comma.

The Timelines tab lets you rearrange the timelines for the current account.

The Timelines list is a standard list box.

Alt+U moves the selected timeline up. Alt+D moves the selected timeline down. Delete removes the selected timeline, if it is removable.

Home, Mentions, Notifications and Sent are regarded as required core timelines.

There is also a Restore to Defaults button. This restores the core timeline set. Custom timelines cannot be restored if they have been removed, because the app cannot know which custom timelines a user still wants.

When a timeline is moved, JAWS gives a short confirmation such as:

Mentions moved below Home.

Reading Posts.

Use Up and Down Arrow in the Posts list to move through posts.

Use Left and Right Arrow to move through the configured fields in the focused row.

Press Enter to open the focused post in a Post Details dialog.

The Post Details dialog contains:

Escape closes the Post Details dialog.

If the post is from your own account, Follow and Unfollow buttons are not shown.

If the post is from your own account, the profile button is Edit Profile.

If the post is from someone else, the profile button is Read Profile.

For boosted posts, the app tries to say both who boosted the post and who originally wrote it.

Example:

Belinda Jones boosted Lizzie Williams.

Quoted posts are also included in the full post text where the instance provides the quote data.

Where Am I.

Control+Shift+I is Where Am I.

This is intended to give useful context without forcing the user to inspect the whole window.

In the main window, it can say things such as:

Account name BrianHartgen, Mentions timeline, post 12 of 80.

In Options, it can say which settings page is being configured.

In the Compose dialog, it gives composition information such as the current field, how many characters have been typed and how many characters remain.

Context Menu.

Press the Applications key or Shift+F10 to open the context menu.

The first part of the context menu contains common commands directly.

These include:

At the bottom is More Actions.

More Actions includes:

The context menu is expected to change as the project develops.

New Posts.

Press Control+N to compose a new post.

The Compose dialog uses standard Windows controls.

The main controls include:

The post text field is deliberately wide so JAWS reads more comfortably while composing.

Pressing Enter in the compose edit field activates OK.

The title bar shows the character count, for example:

123 of 5000 characters.

If you exceed the instance character limit, a sound can be played if sounds are enabled.

The Visibility combo box currently includes:

Replying.

Control+R replies to the author of the focused post only.

When the Reply dialog opens, the edit field is prefilled with the author's username, followed by a space. The cursor is placed after the space so you can type immediately.

Example:

@brianhartgen

Control+Shift+R replies to all relevant users mentioned in the post, but it should not include your own username.

This distinction is important. Reply replies to the author. Reply All includes additional participants where appropriate.

Quoting.

Control+Q quotes the focused post.

Where the Mastodon instance supports quote posts, LeaseySocial sends the quote using the instance's quote-post API.

Where the instance does not support quote posts, the app falls back to inserting a link to the original post using a simple RE: style prefix.

This is an area where beta feedback is especially useful, because Mastodon quote support is still not as universal as ordinary replies or boosts.

Quoted posts should be included when reading the full post, and links inside quoted posts should be included when using Open Links.

Boosts, Favourites and Bookmarks.

Control+B boosts the focused post.

When a post is boosted, LeaseySocial should say who was boosted.

Control+K bookmarks the focused post.

Control+Shift+K removes the bookmark.

Control+Shift+F favourites the focused post.

Control+Alt+F unfavourites the focused post.

Favourite and Unfavourite are also available from the Post Details dialog.

Pinned Posts.

Pin Post to Profile pins one of your own posts to your Mastodon profile.

Unpin Post from Profile removes one of your pinned posts from your profile.

Pinned Posts opens a timeline containing the posts currently pinned to your profile. From there, you can use the normal edit, delete or unpin commands where appropriate.

You cannot pin or unpin another user's post.

Deleting and Editing Your Own Posts.

Press Delete on a post you have sent to delete it.

You cannot delete another user's post.

Alt+E edits a post you have sent.

If an action is not allowed by the server, or if the post is not yours, the app should show a clear accessible error.

Direct Messages.

Control+D opens the Direct Message dialog.

The dialog contains:

If a post is focused, the username field is prefilled with the focused user's username. You can erase it and type another username if needed.

The message is sent with direct visibility.

Control+Slash opens Search.

The Search dialog contains:

The Search type combo box includes:

Search results open as a timeline named Search followed by the search term.

Search timelines can persist across sessions if they are left in the Timelines list.

Find in Current Timeline.

Control+F searches for text in the current visible timeline.

F3 finds the next match.

Shift+F3 finds the previous match.

This is a local find command. It searches what is currently loaded in the Posts list; it does not ask the Mastodon server for new results.

Copying Posts.

Control+C copies the focused post to the clipboard.

The copied text includes a readable author line and the post body. For boosts and notifications, the copied text should include the relevant context, such as who boosted or favourited the post.

Control+O opens a list of links found in the focused post.

Links from quoted posts are included where the quote data is available.

The links are shown in a standard list box. Arrow to the desired link and press Enter to open it in the default browser.

The app attempts to avoid presenting only the Mastodon status URL when there are useful web links in the post.

Media and Image Description.

If a post contains an image, the Posts list begins the post text with:

Image attached.

If a post contains audio, the Posts list begins the post text with:

Audio attached.

If a post contains media more generally, sounds can be configured to play when moving over the row.

Describe Image with ChatGPT is available from More Actions.

The OpenAI API key is read from Leasey's ChatGPT settings so there is no special configuration to do.

Audio playback can pass playable audio attachments to Leasey Media Centre. Control+Enter is the shortcut for Play Media.

Content Warnings.

In the Compose dialog, check Content warning to enable the content warning edit field.

Enter the warning text in that field.

When sent, the post is submitted to Mastodon with the warning text.

Reading content warnings is controlled from Options on the Reading tab.

The Content warnings combo box contains:

This is account-specific.

Thread Mode.

Thread Mode is available in the Compose dialog.

When Thread Mode is checked, after one part of the post is sent, the compose edit field appears again so the next part of the thread can be written.

Scheduling and Thread Mode are not intended to be used together in the current proof of concept.

Scheduling Posts.

Scheduling is available in the Compose dialog.

Check Schedule Post.

The scheduling controls use combo boxes rather than free typing.

The controls include:

The time format is 12 hour.

When a post is scheduled, LeaseySocial sends it to the Mastodon instance as a scheduled post. It does not immediately refresh the timeline as though the post had already been published.

Polls.

Polls are available near the end of the Compose dialog.

Check Poll to enable poll creation.

The poll controls include:

The Option text edit field is labelled so JAWS should announce it correctly.

At least two poll options are required.

Mastodon does not allow polls and media attachments in the same post, so LeaseySocial prevents that combination.

When opening a post containing a poll, the Post Details dialog includes poll information where the server provides it.

Conversations.

Control+G opens the conversation for the focused post.

The conversation opens as a temporary timeline showing the available related posts.

If you have chosen to show newest posts at the bottom, the conversation order should respect that preference.

Conversation timelines can be closed with Control+W.

User Timelines.

Control+U opens a User Timeline dialog.

If a post is focused, the username field is prefilled with the focused user's username.

For boosted posts, the dialog should offer both the original author and the person who boosted the post where possible.

You can type a username without the at sign if the user is on the same instance.

Example:

JemimaPuddleDuck

For users on another instance, enter the full address.

Example:

JemimaPuddleDuck@quack.space

The retrieved posts open as a timeline named User followed by the username.

Following and Followers.

People I Follow is available from More Actions.

People Following Me is available from More Actions.

Each opens a timeline-style list of accounts.

This gives a way to browse the accounts you follow and the accounts following you.

Follow and Unfollow.

Control+L follows a user.

Control+Shift+L unfollows a user.

When invoked from a post, the app opens a dialog containing users found in the post. This can include the author, boosted-by user, quoted author and mentioned users where available.

You can arrow through the choices and press Enter.

If the required user is not in the list, type a full username into the edit field.

The same style is used for follow and unfollow.

In the Post Details dialog, Follow or Unfollow buttons are only shown when appropriate. If you already follow the author, Follow is not shown. If the post is from your own account, neither Follow nor Unfollow is shown.

Profiles.

From the Post Details dialog, use Read Profile for another user or Edit Profile for your own account.

Read Profile displays available profile information in the app.

Edit Profile allows editing of your own display name and profile note in the app rather than sending you to the instance web site.

Mute and Block.

More Actions includes:

These use Mastodon server features.

Mute Conversation applies to the current conversation where the server supports it.

Mute User, Unmute User, Block User and Unblock User operate on the selected user.

Local and Instance Timelines.

Recent Posts on This Instance opens a timeline of recent local posts.

Recent Posts on Another Instance asks for an instance name, such as:

hartgenconsultancy.social

It then retrieves recent local posts from that instance.

These timelines can be left open and can persist across sessions if they remain in the Timelines list.

Lists Manager.

Control+Shift+S opens Lists Manager.

The Lists Manager displays Mastodon lists already present on the server. This means lists created in another client should appear.

The dialog contains:

New List asks for:

Name of List. Show Replies to combo box. Hide list members from home timeline check box.

The Show Replies to combo box includes:

Existing lists can be edited or deleted.

Members opens a list of accounts already in the list. Accounts can be removed.

Add Account asks for a username. Mastodon normally requires that you already follow an account before it can be added to a list.

Open Timeline opens the selected list as a timeline.

Filters Manager.

Filters Manager is available from More Actions.

It contains two sections:

LeaseySocial filters are local filters. They are account-specific and apply to what LeaseySocial displays, speaks, Brailles and sounds.

They are applied retrospectively to the current cached timeline. For example, if a Home timeline already contains boosts and you create a local filter for boosts, the boosts should disappear from the visible timeline when the manager closes. The cached data is not deleted.

A LeaseySocial filter contains:

The available local filter categories are:

If Contains text is filled in, the text must match for the filter to apply.

If no category is checked but Contains text is filled in, the filter works as a text-only filter.

Server keyword filters use Mastodon's server filter API.

The server filter section can:

When creating a server filter, the dialog contains:

Server contexts include:

Server actions include:

Server filter behaviour depends on the Mastodon instance and the permissions available to the app.

Nicknames Manager.

Nicknames Manager is available from More Actions.

This is similar to a small speech dictionary.

It lets a user enter:

Name or username. Say instead.

Example:

@verylongcomplexusername

could become:

John.

The nicknames are account-specific.

They apply retrospectively when the current timeline reloads.

They are applied to:

This is useful where usernames or display names are complex, difficult to remember, contain unusual punctuation or are not convenient to hear repeatedly.

Options.

Open Options with Control+Comma.

Options currently contains these tabs:

More configuration is expected later.

General Options.

The General tab contains:

Data location allows the writable app data to be stored somewhere else, such as OneDrive, Dropbox, a network drive or a portable drive. You already know about this.

Restore to Location Default returns to the regular location for storing the data.

Show newest posts at bottom reverses the timeline display so the newest post appears at the bottom. Many users prefer this because new streamed posts arrive where they expect.

Condense multiple leading mentions changes how leading usernames are read. For example, if a post begins with two or more mentions, the app can say the first name and indicate that there is one more, rather than reading every username at the start of the row.

When you open the post with Enter, the full uncondensed text is still shown.

Minimize to system tray allows the app to remain running in the tray when minimized.

Reading Options.

The Reading tab is account-specific.

It contains:

The Content warnings combo box controls how posts with content warnings are presented.

Show post text only gives the post text without first announcing the warning.

Show content warning followed by post text says the words Content warning, then the warning term, followed by the post text.

Hide post text and show content warning only shows just the warning text. This is useful if the user does not want protected text exposed automatically while arrowing through the timeline.

Remove emojis and other unicode characters from post text strips non-ASCII characters from post text. This can reduce clutter when JAWS speaks emoji, symbols or unusual characters in a way the user finds distracting.

Use Control+Enter to send posts instead of Enter changes the Compose and Direct Message dialogs so Enter inserts a new line and Control+Enter sends the post or message.

Sync home timeline position with Mastodon attempts to update the Mastodon Home marker as you move through the Home timeline. This may help if the same account is used in more than one Mastodon app, but it depends on how other apps and the instance use Mastodon markers.

Columns Options.

The Columns tab is account-specific.

It controls what is spoken and Brailled for each item in the Posts list, and the order in which that information appears.

The current fields are:

Status indicates the post visibility or item type, such as Public, Unlisted, Followers only, Direct message, User or Hashtag.

The Columns list is a standard list box.

Alt+U moves the selected field up. Alt+D moves the selected field down. Delete removes the selected field.

At least one field must remain.

Restore to Defaults brings back the full default set.

The Posts list reflects the order and fields chosen here. For example, if you only want Author and Post spoken in the main list, remove Date, Client and Status. If you want Status spoken before the post text, move Status above Post.

Left and Right Arrow in the Posts list also follows the same configured order.

This replaces the earlier experimental JAWS list-view column customisation approach. The app no longer uses the JAWS CustomizeListView script because the Posts list is now a list box rather than a multi-column Windows list view.

Speech Options.

The Speech tab is account-specific.

It contains check boxes for the timelines available to the current account. This even applies to any custom timelines such as those displaying posts from a specific instance. They are clearly labeled so you know exactly which timeline it relates to.

Each check box controls whether new items for that timeline are spoken and Brailled when they arrive.

For example, you can disable speech for Home while keeping speech for Mentions and Notifications.

The controls are individual check boxes, so you can Tab to each timeline and check or uncheck it.

Sounds Options.

The Sounds tab is account-specific.

It contains:

Sound packs live under the app's Data\Sounds folder. What that means in practice is that not only can you create your own soundpacks but also they are synchronised across devices potentially. Each sound pack has its own sub-folder.

Users may eventually be able to create their own sound packs.

The Available sounds list shows the sounds found in the selected sound pack using friendly descriptions, such as Startup sound, New home post, Post contains a poll, and Boundary, top or bottom of list.

Use Preview Sound to hear the selected sound at the current volume.

Sounds only play if Leasey's sound preference is enabled by pressing the Leasey key followed by O.

Sounds currently supplement speech and Braille. They do not replace speech or Braille.

Examples of sound events include:

Ready when the app has loaded.

Home post.

Mention.

Notification.

Image.

Media.

Boundary when reaching the top or bottom of a list.

Close when closing a timeline.

Error.

Max length when typing beyond the character limit.

Individual timelines can be muted for sounds while leaving sounds enabled elsewhere.

Shortcut Keys Options.

The Shortcut keys tab contains global hot key settings.

These are unassigned by default because global hot keys are at a premium and may conflict with other applications.

Each shortcut is represented by an edit field. You type the keystroke as text.

Example:

ALT+Shift+Up

The app does not capture the keystroke physically. You type the words and symbols.

Available global shortcut actions include:

These are intended for users who want to read timelines without focusing the LeaseySocial window.

Note that some experimentation may be required to create global keystrokes as some may cause conflict between LeaseySocial and other applications. If we think there is a conflict we will try to warn you when you save.

There is also an Unassign all Keystrokes button.

Streaming.

Streaming starts automatically. New Home posts, Mentions and Notifications are streamed.

If multiple accounts are configured, all accounts stream.

Timeline speech and sound settings are respected when new streamed items arrive.

If a local LeaseySocial filter hides a streamed item, it should not be inserted into the visible list and should not be spoken, Brailled or a sound played.

Startup Mentions and Notifications Summary.

At startup, LeaseySocial checks whether there are new Mentions or Notifications since the last time the app saw those timelines.

If there are new items, it can say something like:

2 new mentions and 3 new notifications.

The app tries to avoid false large counts when the previously seen item is no longer in the first loaded batch.

Braille Status Bridge.

The technology being used to communicate status messages, such as when a new post arrives and when you are focused away from the app, uses speech only. LeaseySocial however contains a special app for relaying the same information as a Braille Flash Message. So whenever any kind of status message is spoken, this should be displayed in Braille on your Braille display, if you have one.