Admiral Patrick

I learned to play the guitar growing up as a young rapscallion in Mississippi. But things didn’t really take off until I moved to Memphis. There I met the Colonel and the hits just kept coming. Unfortunately, the fame went to my head, I gained a lot of weight, started wearing a white jumpsuit, and ate tranquilizers like they were trail mix. Then, in 1977, I died on the toilet.

Or did I?


I also develop Tesseract UI for Lemmy/Sublinks

  • 15 posts
  • 2 comments
Joined 3 years ago
Cake day: June 6th, 2023

This is the change log for both 1.5.2 and 1.5.3. Just small adjustments and a couple new minor features (cake day indicators, can filter out communities you’re banned from).

Post image is showing the feed where a post to a community I’m banned from is now filtered. These can optionally be hidden, but that doesn’t make for a very useful feature screenshot. It also shows how a filtered item looks when it hits on multiple filter policies. (Apparently I downvoted one too many posts to the DailyFail in that community lol.)

Get Tesseract

Bugfixes

  • [1.5.2] “Defederated” badge wasn’t reactive and failed to reset; showed users as being defederated when they were not
  • [1.5.2] Show full (compact) post and comment in report and remove modals when “Show submission” is selected. Also changed “Hide Submission” defaulting to true to “Show Submission” defaulting to false. This make the option more clear.
  • [1.5.2] Report button on posts was enabled even with no active profile. Is now properly disabled unless you’re logged in and not banned.
  • [1.5.3] Settings array editor member scroll area was awkwardly large; changed max height from 50vh to 25vh to better fit where it’s used.

New Features

  • [1.5.2] Cake Day indicator next to username in post/comments as well as a cake day badge in user profile cards
  • [1.5.3] You can now filter, and optionally hide, posts in the feed that are to communities where you are banned.
    • This is available at Settings -> Filters -> Communities -> Filter Posts to Banned Communities.
    • Note: It only applies to the feed. It does not apply if you are viewing someone’s profile, if you are browsing the community directly, if you open or click into the post, or if someone mentions you in the comments.

Changes

  • [1.5.2] Redesigned the “back” buttons within User, Community, and Moderation modals. Moved it into the modal title bar and reclaimed a bit of vertical space.
  • [1.5.3]Community group memberships are now shown in the community profile modal and can be managed similarly to how user tags are managed in the user profile modal. It’s slightly different as clicking a community group badge opens the community editor while the user tag simply toggles on/off.
  • [1.5.3] Community group badges are now the same color. Previously filter groups were shown with a black and white badge while regular groups used an emerald badge. They’re both emerald now, but the icons are still unique (Funnel icon for filter group, Folder icon for regular group)
  • [1.5.3] Moved site languages list into Site Info accordion in site sidebar
  • [Both] Various UI tweaks

Just released a new version with some bugfixes and minor tweaks. Post photo is an example of the updated community card with the better-looking stats row. User and Site cards were updated similarly. This one is fairly minor, but the archive link / alternate source menu was completely broken so I wanted to get that fixed, hopefully before people start updating.

Get Tesseract

Changelog

Bugfixes

  • Fixed spacing between internal components in Post and CommentItem components
  • When viewing a post in a modal, the cursor was not the correct text seletion “I-beam” cursor.
  • User post feeds no longer do crosspost rollups. It seemed like a good idea at the time, but due to filtering, if they crossposted something from an instance you filter, you won’t see the item to the instance you haven’t filtered. May do some work later to better deal with crossposts and how they interact with the filtering system. Have I mentioned I hate crossposts? Because I really hate crossposts.
  • Except for deleted and removed posts, the color-coded backgrounds are now only visible in the feed.
  • The archive link / alternate source selector was completely and utterly broken. Like, how did I NOT notice that? Anyway, it’s fixed.
  • Unlinked the Github repo from the Codeberg repo since every time I push to a new branch on Codeberg, Github would put my latest release back into draft.

Changes

  • Site, Community, and User cards have text labels for the stats instead of the cryptic icons.
  • Add border effect around link and embed description component. Tweak hover colors over collapse/expand buttons.
  • Remove menu in account selector and add discrete buttons for reordering and deleting accounts. Tweak coloring/effects.
  • Removed community stats/counts from communitiy banner in Community Modals
  • Added full community banner with stats and counts into the “Community Details” tab of the Community Profile modal
  • Collapsed post bodies in the feed will now expand if you click anywhere inside it.
    • Particulary useful when post content is within a spoiler block to avoid multiple clicks to see
    • Clicking the body when expanded does nothing
    • Post body preview in feed is now smaller
  • Added manual refresh button to modlog

New Features

  • When creating a group in the group management section of Settings, you can now define more group options and add communities (previously required going back to the list to edit the group)
  • Posts in the feed to communities you moderate are highlighted purple. Can be disabled at Settings -> Feed -> Highlight Modded Community Posts
  • You can now disable how it highlights your own posts in the feed at Settings -> Feed -> Highlight My Posts
  • Added modlog action type selectors to the embeddable modlog component (used with the “View Modlog” button in User, Community, and Moderation modals). Now you can do some basic filtering within the item’s modal window without always having to load the full modlog)
  • Added a “Browse as Guest” button to the login page of the selected instance. Gives you a better flow:
    • Accounts -> Add -> Select Instance -> Login or Browse as Guest

Lemmy 1.0 Support

Currently, I’m relying on the APIv3 compatibility they supposedly promised for initial 1.0 support. I refuse to start development until there is a stable JS client and TS docs as I have other things in my life that require attention and can’t spend all day, every day, chasing that moving target.

Once 1.0 has at least a stable JS client package, I’ll start work on Tesseract 1.6 (which will likely drop support for 0.19.x). However, full-swing development against 1.0 cannot begin until I upgrade my own instance as all of the mod and admin tooling will need to be validated.

At this time, the following works in 1.0:

  • Signing up
    • Can only test open signup flow since voyager.lemmy [dot] ml is not configured with email verification, application, or captcha.
  • Logging in
    • Local/normal login without TOTP. The user endpoint does not work with APIv3 so can’t even attempt to turn on TOTP and test
  • Commenting on posts
  • Replying to another comment
  • Creating a post
  • Voting on posts/comments
  • Notifications at least don’t throw an error when it polls for them, but due to the user endpoint not working, I can’t test checking the inbox.

Known NOT to work due to half-assed/missing backwards compatibility in 1.0’s API:

  • Modlog
  • Viewing your or any user profile (including user profile modals)
  • Federated instances
  • Creating a community

Untested:

  • Everything not in the list above

I have no idea why, but Github keeps reverting the 1.5.0 release to draft. I’ve had to re-publish it 5 or more times and it just keeps going back to draft.

Finally I just deleted the release and did an entirely new one. Fingers crossed.

If you’re subscribed to release notices, I apologize if you may have been spammed by that. I’m just as annoyed with Github as you are.


The main work is in Codeberg now, but I’m still mirroring to Github and using it for releases as people are subscribed to them there. It’s also got the Actions which perform the builds as well as the container registry. I don’t strictly need the builds, but that would mean I’d have to get rid of the arm64 images as I can’t build those locally (unless I want to do the builds on a Pi).

I also don’t have a replacement container registry, either.

So, if someone has any suggestions for a CI builder and container registry, I’m open to ideas. I self-host most of my infra, but don’t want to deal with adding those onto it.


Update: Seems to be related to the mirroring from Codeberg. Every time I push to the 1.5.1 branch, Codeberg mirrors that over, and Github moves the 1.5.0 release back to draft. What the actual fuck?

Anyway, I’ve disabled the mirroring and will just manually push to Github when it’s time to do a release.

Cross-posted from “Tesseract v1.5.0 Released [Tesseract] [Lemmy] [WebApp]” by @ptz@dubvee.org in !lemmyapps@lemmy.world


1.5.0

This version is nearly a year in the making, and I’m glad to finally have it out the door.

Major Goals Achieved in this Version

  1. Give the entire UI a nice overhaul, move more things into reusable components, and generally polish everything up.
  2. Reduce memory waste by not storing unnecessary/redundant data in components
  3. Fix as many longstanding bugs and feature omissions as possible.
  4. Provide additional capabilities for mods and admins
  5. Give users more control over the content they see.
  6. Increase the health and safety of the overall platform
  7. Provide a better “default” experience, especially for new and guest users.

Get Tesseract

Screenshots

New Instance Selector

Settings, Filter Policies, Community Groups, and User Tagging

Media Browser

Language Selector and Ability to Browse and Insert Media You’ve Already Uploaded

Deployment Notes for Admins and Self-Hosters

“Lock to Instance” is No Longer Implicit

In prior releases, locking Tesseract to the configured instance was the default behavior. I asked if this was intentional or just because no one ever strays from the default settings, but absolutely no one replied to that post, so I just made the decision myself.

Now, unless configured otherwise, Tesseract will allow adding accounts from any instance. This is to allow people to easily switch between alts on different instances without having to use a 3rd party hosted version of Tesseract.

If you wish to lock Tesseract to just the configured instance, you MUST set the environment variable to do so:

PUBLIC_LOCK_TO_INSTANCE=true


NSFW Communities are Hidden by Default

By default, NSFW communities (not NSFW posts) are hidden (unless you are an admin a mod).

Users can go to Settings -> Filters -> Communities and uncheck the options to filter/hide those.

If you want to override this behavior, for example, if you’re running a dedicated NSFW instance, you may do so by adding the following two environment variables:

  • PUBLIC_FILTER_NSFW_COMMUNITIES_BY_DEFAULT=false
  • PUBLIC_HIDE_NSFW_COMMUNITIES_BY_DEFAULT=false

If you want them filtered but not hidden by default, only set PUBLIC_HIDE_NSFW_COMMUNITIES_BY_DEFAULT to false. If you want them fully visible by default, set both to false

This only changes the default settings for new users; existing profiles will keep whatever their current settings are.


Increased Calls to /api/v3/modlog

At minimum, you will see a 4x increase in the number of calls to /api/v3/modlog.

Don’t panic! That behavior is, counter-intuitively, intentional. However, if you have restrictive rate limits, you may need to account for this (I’ve tested on several different instances and have not had any problems).

Why? It is currently faster and less resource intensive to make four scoped requests to getModlog than it is to request the full modlog in one call. Additionally, old and irrelevant actions that aren’t performed frequently (transfer community, add/remove mod, etc) are not cluttering up the modlog results.

On average, and tested against multiple instances, this seems to be about 40% faster than requesting the full modlog in one go.

By default, the modlog now only looks up the following actions (and their opposites):

  • Ban Instance
  • Ban Community
  • Remove Post
  • Remove Comment

Those are the most frequently needed calls, and when the modlog loads, it does 4 simultaneous requests scoped to each of those actions.

If you need the full results, there is an option on the modlog page to switch to searching it in full which will use the “classic” behavior. Additionally, if you are only interested in a specific action type, selecting that action will scope the modlog lookup accordingly without having to do a full query.


Bugfixes

Note that the bugfixes mentioned here are only ones that didn’t involve a rewrite of the underlying components. Lots of other bugs were fixed in the process of refactoring and re-implementing (and probably new bugs created :sigh:)

  • Performance optimizations: Some sub-components that made up the Post component still had full embedded modals inside rather than triggering the system modals to open and load the data on-demand. Moving these integrated modals out reduced CPU and memory consumption. Additionally, redundant and/or usless data in community, user, post and comment items (such as full copies of the community sidebar, redundant Person info, etc) are discarded before rendering components.

  • “Scroll to Top” in footer of comment section was not justified correctly.

  • Sometimes when viewing a single comment therad and then clicking “View Full Thread” to load the comments in full, they wouldn’t load due to a race condition.

  • Not really a bug, but sometimes when clicking “Load X More…” under a comment that appears to have more replies, a warning would show up that none were returned. This is most often because the next-level reply is by someone you’ve blocked or has been removed by a moderator. The warning toast message is now more descriptive to indicate this.

  • Feed “jumps” sometimes in Firefox.

    • I thought I had this fixed but started seeing it again. Basically when the infinite scroll buffer fills up, it removes older posts from the beginning of the buffer. Most of the time, this is invisible. Occasionally in FF it would trigger unwanted reactivity and cause the feed position to jump down.
    • Removed that buffer entirely and keep all posts
  • “Limit Comment Height” feature was buggy and didn’t always show the expand/collapse button. Just removed this feature since the div height of the comment body isn’t reactive enough to make this work reliably.

  • If there was an API error during a mod action from the mod modal, the spinner remained and the button stayed disabled

  • Edit community group modal did not close properly after save or delete

  • “Block User” action in the user profile modal now has a confirmation step.

  • Better error handling in user profile modal when user is not found

  • Fixed weird gap between “Search for Alts” and “Modlog History…” in user profile modal.

  • User Profile Modal and User Feeds: Don’t display type/sort selectors, search field, or pagination buttons if user fails to load or is not found

  • Known badge images are now rendered and linked properly without being resized and rendered as a zoomable image.

  • Added support to add “badge” to markdown image syntax to prevent it from being rendered like a regular image

    • ![Alt Text](https://example.com/image.jpg "badge") Which is simiilar to how custom emojis are formatted.
    • Other clients should ignore this
  • “Mark Post as Read on Scroll” feature has been changed. Instead of marking them as read on scroll, it will mark the whole batch as read upon load. If the option to fade read titles is enabled, they will be faded on the next load.

  • The search page was a dumpster fire. Completely re-wrote it.

  • Fixed Loops lookup after the project updated it’s web UI (more below in the “Deprecated: Legacy Loops Support”).

  • User->Settings->TOTP Setup: Don’t generate secret/QR code until modal is opened.

  • Fixed missing loading indicator when denying a registration application.

  • Searching for alts within the user profile modal will now let you tweak the search term and search inline (e.g. to remove trailing numbers, etc)

  • If currently connected instance is down, application no longer fails to load. Also allows you to switch to an alt.

  • Attempted to work around the 300 comment limit bugs 4543 and 5861 but found a new bug in that when switching from max_depth to limit and page, no page number above 10 will work. In theory, that would let Tesseract display up to 500 comments instead of 300, but due to duplicates, the actual number is only a bit larger than the 300 limit used with max_depth. Given the additional complexity of making parallel calls to getComments, merging those results, and error handling each, I’ve opted to revert back to max_depth and live with the 300 comment limit until it’s addressed at the API level.

  • Markdown images are now full-width and height-bound.

  • Squash notification and mark replies and mentions as read if you’ve voted on them.

  • Badge images (img.shields.io, etc) are attempted to be accounted for and exempted from being turned into standard markdown images.

    • To always have them show unprocessed, add "badge" to the title portion of the image markdown code (similar to how emojis have "emoji" for the title text).
    • e.g. ![](https://example.com/stupid-badge.png "badge")
    • Any image that is the “text” component of a hyperlink will also render unprocessed and should not need the "badge" text (though it wouldn’t be a bad idea to include that anyway).
    • e.g. [![](https://example.com/stupid-badge.png)](https://example.com/stats.php)
  • Re-implement MBFC modal using the standard shallow-routing system modals. Re-base modal into system modal container and no longer embed it within the MBFC badge.


Infrastructure

Upgraded NodeJS Runtime

Updated NodeJS runtime from 22 to 25

Breaking Changes

I tried to make the transition and internal migration to the new filter framework as seamless as possible, there is at least one breaking change.

Your filter keywords are now processed as regexes. In most cases, this won’t affect you at all. However, if any of your keywords have punctuation marks or any characters that are regex modifiers, then the keywords may not work as expected:

  • It may be invalid when convverted to regex. In which case, it will gracefully fail and be skipped.
  • It may compile to a valid regex, but not have the intended effect (e.g. may throw false positives).

After your first load of 1.5.0, your existing community, user, and keyword filters will have been automagically migrated to the new format. You should double check the keyword filters by going to Settings -> Filters -> Keywords and checking for any that use non-alphanumeric characters.

Image Proxy Deprecation Notice

The current image proxy/cache is being deprecated due to piss poor performance under load. It is still as functional as it ever was, but will not receive any further work. If/when it breaks, it will be removed. I am likely going to reimplement it as a separate service that doesn’t share the event loop with the main application.

Legacy Loops Support Deprecation Notice

Loops is still supported. However, the Loops project has started providing the correct video tags in the OpenGraph data when looking up the metadata, so the embed video URL is now available by default. The result is that there is no longer a need for a dedicated Loops rendering component since the embed video URL allows it to work correctly with the standard Video render component.

However, for any posts linking to a Loops video prior to that, there is no embed video metadata so the Loops component still needs to lookup the video URL on the fly.

I’ve updated the metadata lookup API in Teseract to extract the video URL from the newly available OpenGraph tags. Older Loops posts will need to use this. This should be a viable long-term solution assuming they don’t disallow remote embeds at some point.

Since Loops now provides the embed video data directly, I’m marking the dedicated Loops component as deprecated and will no longer be maintaining it. It will remain for the foreseeable future so older Loops posts can work, but if it breaks at any point (or if I redo the renderers again), it’ll be removed rather than fixed/updated.

The good thing now is that Loops support is no longer limited to the main “loops.video” instance since I no longer need to identify a post as “Loops” in order to fetch the metadata.


New Features

User Tagging

You can now add an arbitrary number of tags to any user. Tags are limited to 25 characters and can also be used with the filter policies explained below.

Tags can be managed from Settings -> Tags


Community Grouping

This feature has existed for a while, but it got a facelift and overhaul in this release. You can now select icons, search within groups, and there’s better integration with the rest of the application.

Additionally, groups can have filter policies attached to them which gives you really fine-grained control over the content you see in them.

Groups can be managed from Settings -> Groups or by clicking the “Folder” icon in the community profile modals.


Filtering Subsystem Rewrite and Enhancement

This is definitely the most involved new feature in this version and largely responsible for the lengthy development time.

The filtering subsystem has been completely re-written and is much more granular and much more powerful.

There are now two levels you can filter: globally and per community group.

Previously, the filtering was global and the terms “filter” and “hide” were used interchangeably, but in this release, “filter” means the content is still visible but collapsed into a stub you can expand to see. “Hide” means the UI will not show it at all.

Additionally, the filters can now be used without being logged in. So if you want to browse as a guest, you can tailor your experience just the same as you could if you were logged in.

Global filters apply to everything and behave like the filters in previous releases. Use these for things, people, keywords, domains, instances, or platforms that you never, ever want to see.

Community group filtering has the same options as global filtering, but those are only applied to communities that are members of the group you’ve defined.

Filtering Mechanisms

  1. Filter and/or hide accounts by minimum age
  2. Filter and/or hide bot accounts
  3. Filter and/or hide posts you’ve downvoted
  4. Filter and/or hide NSFW posts
  5. Filter and/or hide NSFW communities
  6. Hide removed comments in the comment section
  7. Filter and/or hide your deleted items (in the feed and profile)
  8. Filter and/or hide posts with a negative score (threshold is configurable from -1 to -30)
  9. Filter and/or hide comments with a negative score (threshold is configurable from -1 to -30)
  10. Filter and/or hide content from users that have specific tags
  11. Filter and/or hide users. Users can be added to the policy directly, by regex pattern, and/or by instance
  12. Filter and/or hide communities. Communities can be added to the policy directly, by regex pattern, and/or by instance
  13. Filter and/or hide content by keyword. Keywords are evaluated as regex patterns, so you can get really granular here.
  14. Filter and/or hide content by instance or platform. Hide all content from specific instances or even entire platforms such as Mastodon.
  15. Filter and/or hide posts that link to specific domains. Domains can be wildcards such as *.example.com and there are quick toggles for common domains that have multiple records such as Bluesky, Facebook, Reddit, Twitter/X, and YouTube.
  16. Filter and/or hide content that is not flagged with the specified languages. This is most useful at the community group level as it allows you to limit content in those groups to a specific subset of the languages selected in your profile.
  17. Add users, user regex patterns, communities, and/or community regex patterns to a list of exceptions where the policy rules are ignored.

Notes:

  1. If you’ve opted to hide things in the policy, then any inbox item that the policy flags (post/comment reply, mention, and/or DM) will be hidden and won’t trigger the notification indicator. You can/will still see those in other clients as they won’t hide them, and if you’re sending notifications to email, they will still come through. The filtering is only within the Tesseract UI.
  2. Policies do not interact with one another. If a submission matches multiple policies (multiple group policies and/or your global policy), the most rectrictive action wins. So if you’ve filtered the keyword “Moustache” in your global policy and told it to hide matches, then any group-level keyword matches will be hidden even if those policies are set to only filter.
  3. Filtering works a little differently for mods and admins. See the “Mod/Admin Tools” section below for details.

Example Filter Policy Usage

Example 1: Making a (mostly) politics-free meme experience

This combines the use of user tags, community groups, keywords, and instance filtering.

  1. Add all the meme communities to a group and enable the option in the group to use it as a filter group
  2. Populate the keyword list in the policy with all the hot-button words that apply
  3. Add specific users to the policy that only ever seem to post politics. If they use several alts with the same name on different instances, use a regex instead.
  4. As you’re browsing, tag users who are “always on” and can’t seem to help themselves from injecting politics into everything.
  5. Add the “always on” tag to the meme group policy.
  6. If everyone from the instance example.com is preachy in the meme communities, add example.com to the policy under the “Users -> Instances” tab to filter all users from there.
  7. If all the meme communites from example.ml are preachy propaganda, add example.ml to the “Instances” tab.
  8. On each section (Users, Instances, Domains, Tags), set the “filter” or “hide” action as desired.
  9. Enjoy a better feed :)

Example 2: Hiding News and Politics with the Ability to Quickly Turn Them Back On

Add all of the news and politics communities to a group aptly named “News and Politics”. If you need a break, edit the group and turn on the switch to make it a filter group. Optionally choose to completely hide those communities.

When you’re ready to jump back in, edit the group again and turn off the “filter group” option.


Mentions and Direct Messages Can Be Disabled

In Settings -> Inbox there are two new options that will let you disable mentions (when some one @'s you) and/or direct messages.

When enabled, the following things happen under the hood:

  1. The item is silently marked as read when Tesseract polls for new notifications.
  2. The inbox notification is suppressed and doesn’t factor into the unread count
  3. The item is not shown in the inbox
  4. The “Mentions” and/or “Direct Messages” tabs in the inbox are hidden
  5. When direct messages are disabled, the “Send Message…” option in the user profile modal is disabled.
  6. Other notifications are processed normally.

Note that the notifications are all still in your inbox. If you access your accont from another app, you will see them. If your account is configured to send notifications to email, you will still receive those. The items are only hidden in Tesseract.


Media Browser

You can now browse your uploads from your profile. Currently image and video uploads are supported and rendered correctly. I’m not sure how audio will work as I’ve not been able to test that.

Selecting an upload from the gallery will expand it and give you a few options:

  • Copy a link to the image
  • Delete the image
  • Search for the image. Lets you find posts/comments where you used it and is good to do before deleting an image.
  • Set it as a favorite for quick access later.

Select from Exising Media in Posts/Comments

When you’re posting or commenting, the image button is now a menu. You can upload a new image or choose from your exisiting uploads. Selecting the latter will open the media gallery in a modal. When creating a post, you can only select one item for the post image, but when in the post body or commenting, you can select multiple.

Select the image(s) from the gallery, click “Insert…”, add any alt text, and then insert it.

If you have anything in your favorites (reaction images, etc), you can click to the “Favorites” tab to access them quickly.


Improved Block Management

Blocked users, communities, and instances are now alphabetized for easier review.

You can also search/filter your blocks to quickly find someone (or a communtity/instance) you wish to unblock.

There is also a meta filter you can search:

  • !banned will filter the list for blocked users who have been banned.

I only have anecdotal evidence, but it would make sense that it puts less load on the Lemmy server when there are less blocks to process when generating the feed or comment tree. Thus, removing banned users from your block list can potentially reduce load and lead to better performance.


Post Spoiler Flairs

If a post has the flair [spoiler] in its title (case insensitive), then the post body will be hidden behind a “click to reveal spoiler” overlay similar to the NSFW overlay blur.

Please stop abusing the NSFW tag for spoilers.


New View: Wide-Hybrid

Same as “hybrid” view but full-width. The same configuration you have setup for “hybrid” view will be used here except the feed margins will be disabled.


Language Selection and Management

Users

  • You can now manage your discussion languages in your profile settings. The available languages are limited to those set at the server level. e.g. If your instance only allow English, French, and Spanish, those are the only three that will be available to select.
  • You can now define the language when creating/editing posts and comments
  • The allowed languages for a community are now shown in the sidebar.
    • Note: Only on the community page. When on a post page with the community sidebar, the allowed languages are not available from the API without doing a separate call which is inefficient.
  • The site’s configured languages are now available in the site sidebar

Mods

  • You can now set the allowed languages in the community settings. As with the user’s languages, the list of available languages is limited to only those enabled by the site admins.

Admins

  • The site-level discussion languages can now be configured from the admin panel at Admin->Languages

New Font: Atkinson Hyperlegible

Saw mentions of this font going around, checked it out, and I like it. It seems to be designed for visually impaired, but it also helps dyslexics such as myself without being as wonky-looking as OpenDyslexic (no offense to OD’s creators).

This is also the new default font for the application.


Post / Comment Tag Bar

At the bottom of posts and at the top of comments, there is a bar that will show any community groups, user tags, language, and software platform indicators. Each of those is configurable in Settings -> Posts and Comments -> Post Tags Bar.

The communitiy group indicator(s) are clickable to edit the group. Regular groups are green with a folder icon, and filter groups are black/white with a funnel icon.

User tags are a “person” icon and are not (currently) interactive.

The “Banned from Community” badge will show if you are banned from the post’s community. Clicking it will take you to the modlog entry.


No More Thorns in Your Side

All þ characters are converted to th. The people who like to do this are obnoxious, and it stops now. I’m willing to deal with the 1 in a million false positive.


Defederation Indicator

Community and user cards will indicate if the item’s home instance is defederated from your instance. The create post and other action buttons will also be disabled.


Blind Voting

When blind voting is enabled, scores will be hidden until you’ve cast a vote. This encourages you to both vote/participate as well as to vote based on the content without being influenced by the current score. While I’m not naive enough to think this will competely prevent dogpiling and bandwagon voting, it is a step in the right direction for those who choose to enable this option.

This can be configured in Setitings -> Posts/Comments -> Voting -> Blind Voting

Blind voting only applies for logged-in users who are not bots or banned from a community. Guests or accounts who cannot vote on a submission (bots, banned from community, etc), will always see the scores (unless show scores is disabled) as they cannot vote to trigger the reveal.

Admins: Enabling Blind Voting by Default

If you want to have blind voting enabled by default, you can set the following environment variable:

PUBLIC_ENABLE_BLIND_VOTING=true

Forcing Blind Voting

If you are running Tesseract for your instance and want to force blind voting to always be enabled, you can add the following environment variable to your deploy config:

PUBLIC_FORCE_BLIND_VOTING=true

When this env var is set, the blind voting option will be hidden and always active. This does not require the PUBLIC_ENABLE_BLIND_VOTING variable to be set.

Note: Blind voting only works when you are loggged in. When browsing as a guest, scores will be shown unless the option to hide scores is enabled.


Post Reply Muting

You can now mute replies on up to 25 posts. The option is available from the post action menu (three dots at top of post). Any replies to those posts will be silently marked as read and not included in the notifications. You will still see those replies in the inbox, but they’ll be marked as read leaving your “unread” inbox clean for replies you are interested in. Muted posts have a “Muted” badge in the title to indicate that reply notifications will be discarded.

This also applies to comments on the muted post. For example, if you comment under your own post and then mute replies to that post, any replies to your comment will also be muted.

Behavior

  • If it is your own post, you will not receive notifications for any replies to the post while it is muted.
  • If it is someone else’s post, you will not receive notifications for any replies to your comments to that post

Why Only 25 Posts?

Currently, the post reply muting list is stored along with the rest of your filter policy. This means it has a hard 5 MB limit due to using LocalStorage in the browser. Additionally, since your filter policy applies to all accounts in the application, the post’s ActivityPub ID has to be used as the identifier rather than the post ID (to support accounts on different instances). Storing the ap_id string instead of the post id number increases storage use.

The muted post list acts like a FIFO: When you’ve already got 25 posts muted, the oldest will be un-muted to make room for the current one.

25 was chosen more or less arbitrarily. The point of this feature is not to give you the ability to post without having to get feedback (that’s spam/bot behavior). It’s to allow you to stop receiving notifications when the replies to a particular post go off the rails or start to get stale and repetitive (without resorting to deleting the post or mashing “mark all as read”). Usually after a day or so, that calms down, so if it becomes unmuted later, it might actually be a reply you want to see.


Re-Added Image Upload Proxy to the Tesseract API

Note that this is separate from the general purpose image proxy.

Some instances throw CORS errors when interacting with the pictrs endpoint to upload or delete images from a non-origin domain (e.g. a 3rd party hosted version of Tesseract). I re-implemented the upload proxy that was removed several versions ago and set it to act as a traansparent fallback if the direct image upload fails. I also added a proxy handler for deleting images as those were also getting blocked by CORS in some cases.


Search Revamp

The search has been revamped and no longer tries to be “too much”. I took out the infinite scroll, moved the search scope filters out of the secondary navbar and into the page, and greatly simplifed the logic. And it works so much better. It also has the option to search for post URLs now.

The site/community search bar at the top of the app has also been enhanced.

  • Will detect activity pub URLs, resolve them, and take you directly to the content while skipping the actual search. This lets you quickly load a user/comment/community/post from a federated link. (e.g. paste in an actor ID for a user, and it takes you straight to their profile page. Paste in a post activity pub URL, and it will take you to the local copy of that post.)

    • Also works with both Lemmyverse and Threadiverse links for users, communities, posts, and comments. Haven’t added LemShare yet since it uses a different format. Also not sure how widely-used LemShare is, so may not add support.
  • Search type prefixes to set the search type. You can now prefix the search query to set the search scope from the search box:

    • @user {query}: Searches only for users with the given query string
    • @users {query: Alias for @user
    • @community {query}: Searches only for communities with the given query string
    • @communities {query]: Alias for @community
    • @post {query}: Searches only for posts with the given query string
    • @posts {query}: Alias for @post
    • @comment {query}: Searches only for comments with the given query string
    • @comments {query}: Alias for @comment
    • @url {query}: Searches only for posts which have the provided URL as the post link
  • Search scope modifiers can scope the searches to local, all, subscribed, and/or only your submissions.

    • @all {query}: Searches everything. Default behavior and @all is currently kind of useless
    • @local {query}: Scopes the query to only local ites
    • @subscribed {query}: Scopes the query to only communities to which you are subscribed.
    • @me {query}: Scopes the search to only items you have submitted
  • Set the desired sort direction

    • @old {query}: Sorts by oldest first
    • @new {query: Sorts by newest first
  • Special searches:

    • @localusers will list all local users. Does not take any search parameters. To search for a local user, use @local @user keyword instead. Can only be combined with @old or @new to control the sort.
    • @allusers will show you all known users on your instance.

Example Search Queries

  • https://example.com/post/12345 will automatically resolve and then take you directly to the local copy of that post.

  • https://example.com/u/alice Will automatically resolve Alice and then take you directly to her profile page.

  • @users bob: Will search for users that have “bob” in their username or display name.

  • @community Dogs Searches for any community that has “dogs” in its name or display name.

  • @posts New York City Searches only for posts containing New York City

  • @comments New York City Searches only for comments containing “New York City”

  • @url https://example.com/foo/bar.htm Searches for any posts that link to exactly https://example.com/foo/bar.htm

Combining Scope Modifiers and Search Prefixes

The scope modifiers can also be combined with the search prefixes.

  • @me @local @comment Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard”

  • @me @local @old @comment Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard” sorting by oldest first.

  • @me @local @new @comment Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard” sorting by newest first.

  • @local @comment Captain Picard will search for any comment containing “Captain Picard” only on local communities

  • @local @users Picard will search for any local users that have “Picard” in their username or display name

  • @subscribed @posts Picard will search only communities to which you are subscribed and return only posts containing “Picard”

  • @posts picard @subscribed @local @me will search for any posts containing “Picard” and scope it to only posts you’ve made to local communities to which you are subscribed.

  • @local @communities Star Trek will search for any local communities that contain “Star Trek” in their names.

  • @communities Star Trek @subscribed will search for any subscribed communities that contain “Star Trek” in their names.

  • @communities Star Trek @subscribed @local will search for any local subscribed communities that contain “Star Trek” in their names.

  • @local @url https://example.com/foo/bar.html will search only local posts with the given URL.


LemVotes Integration

It was requested to add a LemVotes link to posts/comments. I was initially against it, and still am, but decided “what the hell?” and added it anyway.

Post and comment action menus now have a “See Votes” option that will search for the item at lemvotes.org.

Since this is an external service, the only guarantee I can make is that the correct AP ID is being sent. Whether it finds the content or is working is out of my control.

Note: Right now, it loads in a modal in an iframe. If that tool ever changes to prohibit embeddng in an iframe, it will have to be turned into an external link.


Mod/Admin Tools

Banning/Unbanning Multiple Communities

In the previous releases, you could only ban a user from a single community or all communities. This is now more granular, and you can select individual communities for the actions. The expiry, remove content option, and reason are used for all actions as before.

Admins Area: Local User List

In Admin -> Local Users you can now list your instance’s users. Since this is limited to what I can do with the /api/v3/search endpoint, the only sorting opitons are Old and New. You can also search for a local user from within this section.

Use Cases:

  • Keep an eye on new signups. It will show the number of posts and/or comments they’ve made
  • Take action against or interact with an account. Clicking their username will open the User Profile Modal for their account giving access to various tools such as their modlog history, submission history, ban/unban tools, vote aggregate history, and messaing options.
  • Check the status of any local account

Send a Welcome Message During Registration Approvals

You can now opt to send a welcome message via DM to newly approved accounts as part of the application approval process. Send a “welcome aboard” message, a getting started guide, or anything you feel might help new users get up and going with their account.

As with the application denial reason, you can set a template to load into this in Settings -> Moderation -> Registration Approval Welcome Message Template

Search for Alts in the Registration Application Menu is Now Localized

Rather than the “Search for Alts” button taking you to the search page in the previous releases, it now loads in a modal so you do not have to leave the application page.

Additionally, you can click on any alt from the results to load that alt’s user profile modal in order to check post/comment history or modlog history. Very useful for vetting new accounts before you approve the application and doesn’t require leaving the application workflow.

Set Site Content Warning

Both the field to set the content warning contents and a method of dipslaying it were both missing in prior releases.

As of 1.5.0, if any text is saved to the “Content Warning” field, then a modal will appear for all users the first time they visit the site. The modal will be shown in place of the UI until the visitor acknowledges it.

Defederate (or Re-Federate) Instances from the Instances Page

Rather than manually putting instance domains into the admin panel, admins will see a “Defederate” or “Re-Federate” button on instances listed on the /instances page.

Note: Apologies for duplicate posts; not sure what happened there. I went back and deleted two of them, but if that doesn’t federate, please feel free to remove them.

1.5.0

This version is nearly a year in the making, and I’m glad to finally have it out the door.

Major Goals Achieved in this Version

  1. Give the entire UI a nice overhaul, move more things into reusable components, and generally polish everything up.
  2. Reduce memory waste by not storing unnecessary/redundant data in components
  3. Fix as many longstanding bugs and feature omissions as possible.
  4. Provide additional capabilities for mods and admins
  5. Give users more control over the content they see.
  6. Increase the health and safety of the overall platform
  7. Provide a better “default” experience, especially for new and guest users.

Get Tesseract

Screenshots

Screenshots

New Instance Selector

Settings, Filter Policies, Community Groups, and User Tagging

Media Browser

Language Selector and Ability to Browse and Insert Media You’ve Already Uploaded

New Community Group Manager

Deployment Notes for Admins and Self-Hosters

“Lock to Instance” is No Longer Implicit

In prior releases, locking Tesseract to the configured instance was the default behavior. I asked if this was intentional or just because no one ever strays from the default settings, but absolutely no one replied to that post, so I just made the decision myself.

Now, unless configured otherwise, Tesseract will allow adding accounts from any instance. This is to allow people to easily switch between alts on different instances without having to use a 3rd party hosted version of Tesseract.

If you wish to lock Tesseract to just the configured instance, you MUST set the environment variable to do so:

PUBLIC_LOCK_TO_INSTANCE=true


NSFW Communities are Hidden by Default

By default, NSFW communities (not NSFW posts) are hidden (unless you are an admin a mod).

Users can go to Settings -> Filters -> Communities and uncheck the options to filter/hide those.

If you want to override this behavior, for example, if you’re running a dedicated NSFW instance, you may do so by adding the following two environment variables:

  • PUBLIC_FILTER_NSFW_COMMUNITIES_BY_DEFAULT=false
  • PUBLIC_HIDE_NSFW_COMMUNITIES_BY_DEFAULT=false

If you want them filtered but not hidden by default, only set PUBLIC_HIDE_NSFW_COMMUNITIES_BY_DEFAULT to false. If you want them fully visible by default, set both to false

This only changes the default settings for new users; existing profiles will keep whatever their current settings are.


Increased Calls to /api/v3/modlog

At minimum, you will see a 4x increase in the number of calls to /api/v3/modlog.

Don’t panic! That behavior is, counter-intuitively, intentional. However, if you have restrictive rate limits, you may need to account for this (I’ve tested on several different instances and have not had any problems).

Why? It is currently faster and less resource intensive to make four scoped requests to getModlog than it is to request the full modlog in one call. Additionally, old and irrelevant actions that aren’t performed frequently (transfer community, add/remove mod, etc) are not cluttering up the modlog results.

On average, and tested against multiple instances, this seems to be about 40% faster than requesting the full modlog in one go.

By default, the modlog now only looks up the following actions (and their opposites):

  • Ban Instance
  • Ban Community
  • Remove Post
  • Remove Comment

Those are the most frequently needed calls, and when the modlog loads, it does 4 simultaneous requests scoped to each of those actions.

If you need the full results, there is an option on the modlog page to switch to searching it in full which will use the “classic” behavior. Additionally, if you are only interested in a specific action type, selecting that action will scope the modlog lookup accordingly without having to do a full query.


Bugfixes

Note that the bugfixes mentioned here are only ones that didn’t involve a rewrite of the underlying components. Lots of other bugs were fixed in the process of refactoring and re-implementing (and probably new bugs created :sigh:)

  • Performance optimizations: Some sub-components that made up the Post component still had full embedded modals inside rather than triggering the system modals to open and load the data on-demand. Moving these integrated modals out reduced CPU and memory consumption. Additionally, redundant and/or usless data in community, user, post and comment items (such as full copies of the community sidebar, redundant Person info, etc) are discarded before rendering components.

  • “Scroll to Top” in footer of comment section was not justified correctly.

  • Sometimes when viewing a single comment therad and then clicking “View Full Thread” to load the comments in full, they wouldn’t load due to a race condition.

  • Not really a bug, but sometimes when clicking “Load X More…” under a comment that appears to have more replies, a warning would show up that none were returned. This is most often because the next-level reply is by someone you’ve blocked or has been removed by a moderator. The warning toast message is now more descriptive to indicate this.

  • Feed “jumps” sometimes in Firefox.

    • I thought I had this fixed but started seeing it again. Basically when the infinite scroll buffer fills up, it removes older posts from the beginning of the buffer. Most of the time, this is invisible. Occasionally in FF it would trigger unwanted reactivity and cause the feed position to jump down.
    • Removed that buffer entirely and keep all posts
  • “Limit Comment Height” feature was buggy and didn’t always show the expand/collapse button. Just removed this feature since the div height of the comment body isn’t reactive enough to make this work reliably.

  • If there was an API error during a mod action from the mod modal, the spinner remained and the button stayed disabled

  • Edit community group modal did not close properly after save or delete

  • “Block User” action in the user profile modal now has a confirmation step.

  • Better error handling in user profile modal when user is not found

  • Fixed weird gap between “Search for Alts” and “Modlog History…” in user profile modal.

  • User Profile Modal and User Feeds: Don’t display type/sort selectors, search field, or pagination buttons if user fails to load or is not found

  • Known badge images are now rendered and linked properly without being resized and rendered as a zoomable image.

  • Added support to add “badge” to markdown image syntax to prevent it from being rendered like a regular image

    • ![Alt Text](https://example.com/image.jpg "badge") Which is simiilar to how custom emojis are formatted.
    • Other clients should ignore this
  • “Mark Post as Read on Scroll” feature has been changed. Instead of marking them as read on scroll, it will mark the whole batch as read upon load. If the option to fade read titles is enabled, they will be faded on the next load.

  • The search page was a dumpster fire. Completely re-wrote it.

  • Fixed Loops lookup after the project updated it’s web UI (more below in the “Deprecated: Legacy Loops Support”).

  • User->Settings->TOTP Setup: Don’t generate secret/QR code until modal is opened.

  • Fixed missing loading indicator when denying a registration application.

  • Searching for alts within the user profile modal will now let you tweak the search term and search inline (e.g. to remove trailing numbers, etc)

  • If currently connected instance is down, application no longer fails to load. Also allows you to switch to an alt.

  • Attempted to work around the 300 comment limit bugs 4543 and 5861 but found a new bug in that when switching from max_depth to limit and page, no page number above 10 will work. In theory, that would let Tesseract display up to 500 comments instead of 300, but due to duplicates, the actual number is only a bit larger than the 300 limit used with max_depth. Given the additional complexity of making parallel calls to getComments, merging those results, and error handling each, I’ve opted to revert back to max_depth and live with the 300 comment limit until it’s addressed at the API level.

  • Markdown images are now full-width and height-bound.

  • Squash notification and mark replies and mentions as read if you’ve voted on them.

  • Badge images (img.shields.io, etc) are attempted to be accounted for and exempted from being turned into standard markdown images.

    • To always have them show unprocessed, add "badge" to the title portion of the image markdown code (similar to how emojis have "emoji" for the title text).
    • e.g. ![](https://example.com/stupid-badge.png "badge")
    • Any image that is the “text” component of a hyperlink will also render unprocessed and should not need the "badge" text (though it wouldn’t be a bad idea to include that anyway).
    • e.g. [![](https://example.com/stupid-badge.png)](https://example.com/stats.php)
  • Re-implement MBFC modal using the standard shallow-routing system modals. Re-base modal into system modal container and no longer embed it within the MBFC badge.


Infrastructure

Upgraded NodeJS Runtime

Updated NodeJS runtime from 22 to 25

Breaking Changes

I tried to make the transition and internal migration to the new filter framework as seamless as possible, there is at least one breaking change.

Your filter keywords are now processed as regexes. In most cases, this won’t affect you at all. However, if any of your keywords have punctuation marks or any characters that are regex modifiers, then the keywords may not work as expected:

  • It may be invalid when converted to regex. In which case, it will gracefully fail and be skipped.
  • It may compile to a valid regex, but not have the intended effect (e.g. may throw false positives).

After your first load of 1.5.0, your existing community, user, and keyword filters will have been automagically migrated to the new format. You should double check the keyword filters by going to Settings -> Filters -> Keywords and checking for any that use non-alphanumeric characters.

Image Proxy Deprecation Notice

The current image proxy/cache is being deprecated due to piss poor performance under load. It is still as functional as it ever was, but will not receive any further work. If/when it breaks, it will be removed. I am likely going to reimplement it as a separate service that doesn’t share the event loop with the main application.

Legacy Loops Support Deprecation Notice

Loops is still supported. However, the Loops project has started providing the correct video tags in the OpenGraph data when looking up the metadata, so the embed video URL is now available by default. The result is that there is no longer a need for a dedicated Loops rendering component since the embed video URL allows it to work correctly with the standard Video render component.

However, for any posts linking to a Loops video prior to that, there is no embed video metadata so the Loops component still needs to lookup the video URL on the fly.

I’ve updated the metadata lookup API in Teseract to extract the video URL from the newly available OpenGraph tags. Older Loops posts will need to use this. This should be a viable long-term solution assuming they don’t disallow remote embeds at some point.

Since Loops now provides the embed video data directly, I’m marking the dedicated Loops component as deprecated and will no longer be maintaining it. It will remain for the foreseeable future so older Loops posts can work, but if it breaks at any point (or if I redo the renderers again), it’ll be removed rather than fixed/updated.

The good thing now is that Loops support is no longer limited to the main “loops.video” instance since I no longer need to identify a post as “Loops” in order to fetch the metadata.

“Save Settings to Lemmy” Removed

Previous versions let you abuse the theme field in your profile to store a copy of the Tesseract settings. This was extremely useful, especially to sync settings between devices.

Sadly, all good things must come to an end. That trick is still possible, but with the expansion of the filter policies, the user tagging, and groups now having the ability to attach a filter policy, there is just too much JSON to try to cram into that field.

I’m working on a way to save those to the Tesseract server itself, but it’s only at the planning stages at present.

For now, the only way to transfer Tesseract settings is exporting to JSON, copying the export, and importing it to the new device/browser.


New Features

User Tagging

You can now add an arbitrary number of tags to any user. Tags are limited to 25 characters and can also be used with the filter policies explained below.

Tags can be managed from Settings -> Tags


Community Grouping

This feature has existed for a while, but it got a facelift and overhaul in this release. You can now select icons, search within groups, and there’s better integration with the rest of the application.

Additionally, groups can have filter policies attached to them which gives you really fine-grained control over the content you see in them.

Groups can be managed from Settings -> Groups or by clicking the “Folder” icon in the community profile modals.


Filtering Subsystem Rewrite and Enhancement

This is definitely the most involved new feature in this version and largely responsible for the lengthy development time.

The filtering subsystem has been completely re-written and is much more granular and much more powerful.

There are now two levels you can filter: globally and per community group.

Previously, the filtering was global and the terms “filter” and “hide” were used interchangeably, but in this release, “filter” means the content is still visible but collapsed into a stub you can expand to see. “Hide” means the UI will not show it at all.

Additionally, the filters can now be used without being logged in. So if you want to browse as a guest, you can tailor your experience just the same as you could if you were logged in.

Global filters apply to everything and behave like the filters in previous releases. Use these for things, people, keywords, domains, instances, or platforms that you never, ever want to see.

Community group filtering has the same options as global filtering, but those are only applied to communities that are members of the group you’ve defined.

Filtering Mechanisms

  1. Filter and/or hide accounts by minimum age
  2. Filter and/or hide bot accounts
  3. Filter and/or hide posts you’ve downvoted
  4. Filter and/or hide NSFW posts
  5. Filter and/or hide NSFW communities
  6. Hide removed comments in the comment section
  7. Filter and/or hide your deleted items (in the feed and profile)
  8. Filter and/or hide posts with a negative score (threshold is configurable from -1 to -30)
  9. Filter and/or hide comments with a negative score (threshold is configurable from -1 to -30)
  10. Filter and/or hide content from users that have specific tags
  11. Filter and/or hide users. Users can be added to the policy directly, by regex pattern, and/or by instance
  12. Filter and/or hide communities. Communities can be added to the policy directly, by regex pattern, and/or by instance
  13. Filter and/or hide content by keyword. Keywords are evaluated as regex patterns, so you can get really granular here.
  14. Filter and/or hide content by instance or platform. Hide all content from specific instances or even entire platforms such as Mastodon.
  15. Filter and/or hide posts that link to specific domains. Domains can be wildcards such as *.example.com and there are quick toggles for common domains that have multiple records such as Bluesky, Facebook, Reddit, Twitter/X, and YouTube.
  16. Filter and/or hide content that is not flagged with the specified languages. This is most useful at the community group level as it allows you to limit content in those groups to a specific subset of the languages selected in your profile.
  17. Add users, user regex patterns, communities, and/or community regex patterns to a list of exceptions where the policy rules are ignored.

Notes:

  1. If you’ve opted to hide things in the policy, then any inbox item that the policy flags (post/comment reply, mention, and/or DM) will be hidden and won’t trigger the notification indicator. You can/will still see those in other clients as they won’t hide them, and if you’re sending notifications to email, they will still come through. The filtering is only within the Tesseract UI.
  2. Policies do not interact with one another. If a submission matches multiple policies (multiple group policies and/or your global policy), the most rectrictive action wins. So if you’ve filtered the keyword “Moustache” in your global policy and told it to hide matches, then any group-level keyword matches will be hidden even if those policies are set to only filter.
  3. Filtering works a little differently for mods and admins. See the “Mod/Admin Tools” section below for details.

Example Filter Policy Usage

Example 1: Making a (mostly) politics-free meme experience

This combines the use of user tags, community groups, keywords, and instance filtering.

  1. Add all the meme communities to a group and enable the option in the group to use it as a filter group
  2. Populate the keyword list in the policy with all the hot-button words that apply
  3. Add specific users to the policy that only ever seem to post politics. If they use several alts with the same name on different instances, use a regex instead.
  4. As you’re browsing, tag users who are “always on” and can’t seem to help themselves from injecting politics into everything.
  5. Add the “always on” tag to the meme group policy.
  6. If everyone from the instance example.com is preachy in the meme communities, add example.com to the policy under the “Users -> Instances” tab to filter all users from there.
  7. If all the meme communites from example.ml are preachy propaganda, add example.ml to the “Instances” tab.
  8. On each section (Users, Instances, Domains, Tags), set the “filter” or “hide” action as desired.
  9. Enjoy a better feed :)

Example 2: Hiding News and Politics with the Ability to Quickly Turn Them Back On

Add all of the news and politics communities to a group aptly named “News and Politics”. If you need a break, edit the group and turn on the switch to make it a filter group. Optionally choose to completely hide those communities.

When you’re ready to jump back in, edit the group again and turn off the “filter group” option.


Mentions and Direct Messages Can Be Disabled

In Settings -> Inbox there are two new options that will let you disable mentions (when some one @'s you) and/or direct messages.

When enabled, the following things happen under the hood:

  1. The item is silently marked as read when Tesseract polls for new notifications.
  2. The inbox notification is suppressed and doesn’t factor into the unread count
  3. The item is not shown in the inbox
  4. The “Mentions” and/or “Direct Messages” tabs in the inbox are hidden
  5. When direct messages are disabled, the “Send Message…” option in the user profile modal is disabled.
  6. Other notifications are processed normally.

Note that the notifications are all still in your inbox. If you access your accont from another app, you will see them. If your account is configured to send notifications to email, you will still receive those. The items are only hidden in Tesseract.


Media Browser

You can now browse your uploads from your profile. Currently image and video uploads are supported and rendered correctly. I’m not sure how audio will work as I’ve not been able to test that.

Selecting an upload from the gallery will expand it and give you a few options:

  • Copy a link to the image
  • Delete the image
  • Search for the image. Lets you find posts/comments where you used it and is good to do before deleting an image.
  • Set it as a favorite for quick access later.

Select from Exising Media in Posts/Comments

When you’re posting or commenting, the image button is now a menu. You can upload a new image or choose from your exisiting uploads. Selecting the latter will open the media gallery in a modal. When creating a post, you can only select one item for the post image, but when in the post body or commenting, you can select multiple.

Select the image(s) from the gallery, click “Insert…”, add any alt text, and then insert it.

If you have anything in your favorites (reaction images, etc), you can click to the “Favorites” tab to access them quickly.


Progress Toolbar in the Infinite Scroll Feed

Okay, not really sure what to call this, but every so often in the feed, the system will insert a toolbar with buttons that will scroll you back to the top of the feed, refresh the feed, or truncate the feed to your current position.

“Refresh” and “Scroll to Top” are pretty self-explanatory. “Truncate” is the main reason for this toolbar.

When you truncate the feed, it removes all posts above the toolbar. This frees up memory and helps keep the app snappy. Otherwise, all post objects would still be listening for events (such a responding to view changes, filter policy updates, etc).

Clicking “Truncate” there removes all posts in the feed above the bar (ones you’ve already scrolled past, and your current position becomes the top of the feed.


Improved Block Management

Blocked users, communities, and instances are now alphabetized for easier review.

You can also search/filter your blocks to quickly find someone (or a communtity/instance) you wish to unblock.

There is also a meta filter you can search:

  • !banned will filter the list for blocked users who have been banned.

I only have anecdotal evidence, but it would make sense that it puts less load on the Lemmy server when there are less blocks to process when generating the feed or comment tree. Thus, removing banned users from your block list can potentially reduce load and lead to better performance.


Post Spoiler Flairs

If a post has the flair [spoiler] in its title (case insensitive), then the post body will be hidden behind a “click to reveal spoiler” overlay similar to the NSFW overlay blur.

Please stop abusing the NSFW tag for spoilers.


New View: Wide-Hybrid

Same as “hybrid” view but full-width. The same configuration you have setup for “hybrid” view will be used here except the feed margins will be disabled.


Language Selection and Management

Users

  • You can now manage your discussion languages in your profile settings. The available languages are limited to those set at the server level. e.g. If your instance only allow English, French, and Spanish, those are the only three that will be available to select.
  • You can now define the language when creating/editing posts and comments
  • The allowed languages for a community are now shown in the sidebar.
    • Note: Only on the community page. When on a post page with the community sidebar, the allowed languages are not available from the API without doing a separate call which is inefficient.
  • The site’s configured languages are now available in the site sidebar

Mods

  • You can now set the allowed languages in the community settings. As with the user’s languages, the list of available languages is limited to only those enabled by the site admins.

Admins

  • The site-level discussion languages can now be configured from the admin panel at Admin->Languages

New Font: Atkinson Hyperlegible

Saw mentions of this font going around, checked it out, and I like it. It seems to be designed for visually impaired, but it also helps dyslexics such as myself without being as wonky-looking as OpenDyslexic (no offense to OD’s creators).

This is also the new default font for the application.


Post / Comment Tag Bar

At the bottom of posts and at the top of comments, there is a bar that will show any community groups, user tags, language, and software platform indicators. Each of those is configurable in Settings -> Posts and Comments -> Post Tags Bar.

The communitiy group indicator(s) are clickable to edit the group. Regular groups are green with a folder icon, and filter groups are black/white with a funnel icon.

User tags are a “person” icon and are not (currently) interactive.

The “Banned from Community” badge will show if you are banned from the post’s community. Clicking it will take you to the modlog entry.


No More Thorns in Your Side

All þ characters are converted to th. The people who like to do this are obnoxious, and it stops now. I’m willing to deal with the 1 in a million false positive.


Defederation Indicator

Community and user cards will indicate if the item’s home instance is defederated from your instance. The create post and other action buttons will also be disabled.


Blind Voting

When blind voting is enabled, scores will be hidden until you’ve cast a vote. This encourages you to both vote/participate as well as to vote based on the content without being influenced by the current score. While I’m not naive enough to think this will competely prevent dogpiling and bandwagon voting, it is a step in the right direction for those who choose to enable this option.

This can be configured in Setitings -> Posts/Comments -> Voting -> Blind Voting

Blind voting only applies for logged-in users who are not bots or banned from a community. Guests or accounts who cannot vote on a submission (bots, banned from community, etc), will always see the scores (unless show scores is disabled) as they cannot vote to trigger the reveal.

Admins: Enabling Blind Voting by Default

If you want to have blind voting enabled by default, you can set the following environment variable:

PUBLIC_ENABLE_BLIND_VOTING=true

Forcing Blind Voting

If you are running Tesseract for your instance and want to force blind voting to always be enabled, you can add the following environment variable to your deploy config:

PUBLIC_FORCE_BLIND_VOTING=true

When this env var is set, the blind voting option will be hidden and always active. This does not require the PUBLIC_ENABLE_BLIND_VOTING variable to be set.

Note: Blind voting only works when you are loggged in. When browsing as a guest, scores will be shown unless the option to hide scores is enabled.


Post Reply Muting

You can now mute replies on up to 25 posts. The option is available from the post action menu (three dots at top of post). Any replies to those posts will be silently marked as read and not included in the notifications. You will still see those replies in the inbox, but they’ll be marked as read leaving your “unread” inbox clean for replies you are interested in. Muted posts have a “Muted” badge in the title to indicate that reply notifications will be discarded.

This also applies to comments on the muted post. For example, if you comment under your own post and then mute replies to that post, any replies to your comment will also be muted.

Behavior

  • If it is your own post, you will not receive notifications for any replies to the post while it is muted.
  • If it is someone else’s post, you will not receive notifications for any replies to your comments to that post

Why Only 25 Posts?

Currently, the post reply muting list is stored along with the rest of your filter policy. This means it has a hard 5 MB limit due to using LocalStorage in the browser. Additionally, since your filter policy applies to all accounts in the application, the post’s ActivityPub ID has to be used as the identifier rather than the post ID (to support accounts on different instances). Storing the ap_id string instead of the post id number increases storage use.

The muted post list acts like a FIFO: When you’ve already got 25 posts muted, the oldest will be un-muted to make room for the current one.

25 was chosen more or less arbitrarily. The point of this feature is not to give you the ability to post without having to get feedback (that’s spam/bot behavior). It’s to allow you to stop receiving notifications when the replies to a particular post go off the rails or start to get stale and repetitive (without resorting to deleting the post or mashing “mark all as read”). Usually after a day or so, that calms down, so if it becomes unmuted later, it might actually be a reply you want to see.


Re-Added Image Upload Proxy to the Tesseract API

Note that this is separate from the general purpose image proxy.

Some instances throw CORS errors when interacting with the pictrs endpoint to upload or delete images from a non-origin domain (e.g. a 3rd party hosted version of Tesseract). I re-implemented the upload proxy that was removed several versions ago and set it to act as a traansparent fallback if the direct image upload fails. I also added a proxy handler for deleting images as those were also getting blocked by CORS in some cases.


Search Revamp

The search has been revamped and no longer tries to be “too much”. I took out the infinite scroll, moved the search scope filters out of the secondary navbar and into the page, and greatly simplifed the logic. And it works so much better. It also has the option to search for post URLs now.

The site/community search bar at the top of the app has also been enhanced.

  • Will detect activity pub URLs, resolve them, and take you directly to the content while skipping the actual search. This lets you quickly load a user/comment/community/post from a federated link. (e.g. paste in an actor ID for a user, and it takes you straight to their profile page. Paste in a post activity pub URL, and it will take you to the local copy of that post.)

    • Also works with both Lemmyverse and Threadiverse links for users, communities, posts, and comments. Haven’t added LemShare yet since it uses a different format. Also not sure how widely-used LemShare is, so may not add support.
  • Search type prefixes to set the search type. You can now prefix the search query to set the search scope from the search box:

    • @user {query}: Searches only for users with the given query string
    • @users {query: Alias for @user
    • @community {query}: Searches only for communities with the given query string
    • @communities {query]: Alias for @community
    • @post {query}: Searches only for posts with the given query string
    • @posts {query}: Alias for @post
    • @comment {query}: Searches only for comments with the given query string
    • @comments {query}: Alias for @comment
    • @url {query}: Searches only for posts which have the provided URL as the post link
  • Search scope modifiers can scope the searches to local, all, subscribed, and/or only your submissions.

    • @all {query}: Searches everything. Default behavior and @all is currently kind of useless
    • @local {query}: Scopes the query to only local ites
    • @subscribed {query}: Scopes the query to only communities to which you are subscribed.
    • @me {query}: Scopes the search to only items you have submitted
  • Set the desired sort direction

    • @old {query}: Sorts by oldest first
    • @new {query: Sorts by newest first
  • Special searches:

    • @localusers will list all local users. Does not take any search parameters. To search for a local user, use @local @user keyword instead. Can only be combined with @old or @new to control the sort.
    • @allusers will show you all known users on your instance.

Example Search Queries

  • https://example.com/post/12345 will automatically resolve and then take you directly to the local copy of that post.

  • https://example.com/u/alice Will automatically resolve Alice and then take you directly to her profile page.

  • @users bob: Will search for users that have “bob” in their username or display name.

  • @community Dogs Searches for any community that has “dogs” in its name or display name.

  • @posts New York City Searches only for posts containing New York City

  • @comments New York City Searches only for comments containing “New York City”

  • @url https://example.com/foo/bar.htm Searches for any posts that link to exactly https://example.com/foo/bar.htm

Combining Scope Modifiers and Search Prefixes

The scope modifiers can also be combined with the search prefixes.

  • @me @local @comment Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard”

  • @me @local @old @comment Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard” sorting by oldest first.

  • @me @local @new @comment Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard” sorting by newest first.

  • @local @comment Captain Picard will search for any comment containing “Captain Picard” only on local communities

  • @local @users Picard will search for any local users that have “Picard” in their username or display name

  • @subscribed @posts Picard will search only communities to which you are subscribed and return only posts containing “Picard”

  • @posts picard @subscribed @local @me will search for any posts containing “Picard” and scope it to only posts you’ve made to local communities to which you are subscribed.

  • @local @communities Star Trek will search for any local communities that contain “Star Trek” in their names.

  • @communities Star Trek @subscribed will search for any subscribed communities that contain “Star Trek” in their names.

  • @communities Star Trek @subscribed @local will search for any local subscribed communities that contain “Star Trek” in their names.

  • @local @url https://example.com/foo/bar.html will search only local posts with the given URL.


LemVotes Integration

It was requested to add a LemVotes link to posts/comments. I was initially against it, and still am, but decided “what the hell?” and added it anyway.

Post and comment action menus now have a “See Votes” option that will search for the item at lemvotes.org.

Since this is an external service, the only guarantee I can make is that the correct AP ID is being sent. Whether it finds the content or is working is out of my control.

Note: Right now, it loads in a modal in an iframe. If that tool ever changes to prohibit embeddng in an iframe, it will have to be turned into an external link.


Mod/Admin Tools

Banning/Unbanning Multiple Communities

In the previous releases, you could only ban a user from a single community or all communities. This is now more granular, and you can select individual communities for the actions. The expiry, remove content option, and reason are used for all actions as before.

Admins Area: Local User List

In Admin -> Local Users you can now list your instance’s users. Since this is limited to what I can do with the /api/v3/search endpoint, the only sorting opitons are Old and New. You can also search for a local user from within this section.

Use Cases:

  • Keep an eye on new signups. It will show the number of posts and/or comments they’ve made
  • Take action against or interact with an account. Clicking their username will open the User Profile Modal for their account giving access to various tools such as their modlog history, submission history, ban/unban tools, vote aggregate history, and messaing options.
  • Check the status of any local account

Send a Welcome Message During Registration Approvals

You can now opt to send a welcome message via DM to newly approved accounts as part of the application approval process. Send a “welcome aboard” message, a getting started guide, or anything you feel might help new users get up and going with their account.

As with the application denial reason, you can set a template to load into this in Settings -> Moderation -> Registration Approval Welcome Message Template

Search for Alts in the Registration Application Menu is Now Localized

Rather than the “Search for Alts” button taking you to the search page in the previous releases, it now loads in a modal so you do not have to leave the application page.

Additionally, you can click on any alt from the results to load that alt’s user profile modal in order to check post/comment history or modlog history. Very useful for vetting new accounts before you approve the application and doesn’t require leaving the application workflow.

Set Site Content Warning

Both the field to set the content warning contents and a method of dipslaying it were both missing in prior releases.

As of 1.5.0, if any text is saved to the “Content Warning” field, then a modal will appear for all users the first time they visit the site. The modal will be shown in place of the UI until the visitor acknowledges it.

Defederate (or Re-Federate) Instances from the Instances Page

Rather than manually putting instance domains into the admin panel, admins will see a “Defederate” or “Re-Federate” button on instances listed on the /instances page.

New Hosted Instance URL: https://tesseractui.org/

The old domain will remain up indefinitely since it’s not costing me any extra money and the new one points to the same server. Just a heads up that there is now a more “official” sounding domain name available. That also further separates the hosted instance from DubVee.

Development update: Home stretch!

All the major features and tweaks that are planned for the launch of v1.5 are completed. I’ve found and squashed a handful of minor bugs, and we’re up to beta #7. Currently doing some last minute polish, specifically related to the onboarding experience.

Pictured is the new instance selection when you go to /login, /signup, and/or /forgot_password. I’m basically working on these while I’m sussing out other potential bugs, so it’s not like I’m wasting time ;-)

Release Timeline: Assuming I don’t find any new bugs in the next day or so, I should be building the release packages soon and merging this branch into main. In the mean time, I have almost a year’s worth of disorganized change logs to summarize as well as put together the release notes and update the README. That is going to suck.

Thank the crappy and rainy Memorial Day weekend for this sudden sprint toward the finish line.

This version is nearly a year in the making, and I’ve finally implemented all of the features I wanted to implement in this version. There’s still some final polishing to do, but all the features are complete and pretty well tested/validated. On that note, 1.5.0 has been promoted from alpha to beta.

Try Tesseract: https://tesseract.dubvee.org/

I should have things moved into the version branch in the coming few days at which point you can build it locally if you want.

Provided no major bugs are uncovered, I hope to have a release version built soon.

Feature Highlight

I can’t highlight all of the visual polish that’s gone into this release, but suffice it to say, pretty much every area of the application has gotten a face lift.

The changelog is still a disorganized mess, so here are the highlights of the new features in this version:

Language Management

This has been an omission for as long as Tesseract has existed, and I’m happy to finally have language configuration and selection added to this version.

Users

  • You can now manage your discussion languages in your profile settings. The available languages are limited to those set at the server level. e.g. If your instance only allow English, French, and Spanish, those are the only three that will be available to select.
  • You can now define the language when creating/editing posts and comments
  • The allowed languages for a community are now shown in the sidebar.
    • Note: Only on the community page. When on a post page with the community sidebar, the allowed languages are not available from the API without doing a separate call which is inefficient.
  • The site’s configured languages are now available in the site sidebar

Mods

  • You can now set the allowed languages in the community settings. As with the user’s languages, the list of available languages is limited to only those enabled by the site admins.

Admins

  • The site-level discussion languages can now be configured from the admin panel at Admin->Languages
User Tagging and Community Grouping

You can now add an arbitrary number of tags to any user. Tags are limited to 25 characters and can also be used with the filter policies explained below.

Community Grouping

This feature has existed for a while, but it got a facelift in this release. You can now select icons, search for groups, and there’s better integration with the rest of the application.

Additionally, groups can have filter policies attached to them which gives you really fine-grained control over the content you see in them.

Filtering

The filtering subsystem has been completely re-written and is much more granular and much more powerful. There are now two levels you can filter: globally and per community group.

Previously, the terms “filter” and “hide” were used interchangeably, but in this release, “filter” means the content is still visible but collapsed into a stub you can expand to see. “Hide” means the UI will not show it at all. Additionally, you can use these without being logged in. So if you want to browse as a guest, you can tailor your experience just the same as you could if you were logged in.

Global filters apply to everything. Use these for things, people, keywords, domains, instances, or platforms that you never, ever want to see.

Community group filtering has the same options as global filtering, but those are only applied to communities that are members of the group you’ve defined.

Filtering Mechanisms

  1. Filter and/or hide accounts by minimum age
  2. Filter and/or hide bot accounts
  3. Filter and/or hide posts you’ve downvoted
  4. Filter and/or hide NSFW posts
  5. Filter and/or hide NSFW communities
  6. Hide removed comments in the comment section
  7. Filter and/or hide your deleted items (in the feed and profile)
  8. Filter and/or hide posts with a negative score (threshold is configurable from -1 to -30)
  9. Filter and/or hide content from users that have specific tags
  10. Filter and/or hide users. Users can be added to the policy directly, by regex pattern, and/or by instance
  11. Filter and/or hide communities. Communities can be added to the policy directly, by regex pattern, and/or by instance
  12. Filter and/or hide content by keyword. Keywords are evaluated as regex patterns, so you can get really granular here.
  13. Filter and/or hide content by instance or platform. Hide all content from specific instances or even entire platforms such as Mastodon.
  14. Filter and/or hide posts that link to specific domains. Domains can be wildcards such as *.example.com and there are quick toggles for common domains that have multiple records such as Bluesky, Facebook, Reddit, Twitter/X, and YouTube.
  15. Filter and/or hide content that is not flagged with the specified languages. This is most useful at the community group level as it allows you to limit content in those groups to a specific subset of the languages selected in your profile.
  16. Add users, user regex patterns, communities, and/or community regex patterns to a list of exceptions where the policy rules are ignored.

Notes:

  1. If you’ve opted to hide things in the policy, then any inbox item that the policy flags (post/comment reply, mention, and/or DM) will be hidden and won’t trigger the notification indicator. You can/will still see those in other clients as they won’t hide them, and if you’re sending notifications to email, they will still come through. The filtering is only within the Tesseract UI.
  2. Filtering works a little differently for mods and admins. See the “Mod/Admin Tools” section below for details.

Example Usage of User Tags, Community Groups, and Filter Policies

Making a (mostly) politics-free meme experience

  1. Add your meme communities to a group and enable the option in the group to use it as a filter group
  2. Populate the keyword list in the policy with all the hot-button words that apply
  3. Add specific users to the policy that only ever seem to post politics. If they use several alts with the same name on different instances, use a regex instead.
  4. Tag users who are “always on” and can’t seem to help themselves from injecting politics into everything
  5. Add the “always on” tag to the policy
  6. If everyone from the instance example.com is preachy in the meme communities, add example.com to the policy under the “Instances” tab.
  7. Enjoy a better feed :)

New Font: Atkinson Hyperlegible

Saw mentions of this font going around, checked it out, and I like it. It seems to be designed for visually impaired, but it also helps dyslexics such as myself without being as wonky-looking as OpenDyslexic (no offense to OD’s creators).

This is also the new default font for the application.

Defederation Indicator

Community and user cards will indicate if the community’s home instance is defederated from your instance. The create post and other action buttons will also be disabled.

Blind Voting

When blind voting is enabled, scores will be hidden until you’ve cast a vote. This encourages you to both vote/participate as well as to vote based on the content without being influenced by the current score. While I’m not naive enough to think this will competely prevent dogpiling and bandwagon voting, it is a step in the right direction for those who choose to enable this option.

Blind voting only applies for logged-in users. Browsing as a guest will still show the scores since there is no ability to vote.

Admins: Enabling Blind Voting by Default

If you want to have blind voting enabled by default, you can set the following environment variable:

PUBLIC_ENABLE_BLIND_VOTING=true

Forcing Blind Voting

If you are running Tesseract for your instance and want to force blind voting to always be enabled, you can add the following environment variable to your deploy config:

PUBLIC_FORCE_BLIND_VOTING=true

When this env var is set, the blind voting option will be hidden and always active. This does not require the PUBLIC_ENABLE_BLIND_VOTING variable to be set.

Note: Blind voting only works when you are logged in. When browsing as a guest, scores will be shown unless the option to hide scores is enabled.

:::

Post Reply Muting

You can now mute replies on up to 25 posts. The option is available from the post action menu (three dots at top of post). Any replies to those posts will be silently marked as read and not included in the notifications. You will still see those replies in the inbox, but they’ll be marked as read leaving your “unread” inbox clean for replies you are interested in. Muted posts have a “Muted” badge in the title to indicate that reply notifications will be discarded.

This also applies to comments on the muted post. For example, if you comment under your own post and then mute replies to that post, any replies to your comment will also be muted.

Behavior

  • If it is your own post, you will not receive notifications for any replies to the post while it is muted.
  • If it is someone else’s post, you will not receive notifications for any replies to your comments to that post
Why Only 25 Posts?

Currently, the post reply muting list is stored along with the rest of your filter policy. This means it has a hard 5 MB limit due to using LocalStorage in the browser. Additionally, since your filter policy applies to all accounts in the application, the post’s ActivityPub ID has to be used as the identifier rather than the post ID (to support accounts on different instances). Storing the ap_id string instead of the post id number increases storage use.

The muted post list acts like a FIFO: When you’ve already got 25 posts muted, the oldest will be un-muted to make room for the current one.

25 was chosen more or less arbitrarily. The point of this feature is not to give you the ability to post without having to get feedback (that’s spam/bot behavior). It’s to allow you to stop receiving notifications when the replies to a particular post go off the rails or start to get stale and repetitive (without resorting to deleting the post or mashing “mark all as read”). Usually after a day or so, that calms down, so if it becomes unmuted later, it might actually be a reply you want to see.

:::

LemVotes Integration

It was requested to add a LemVotes link to posts/comments. I was initially against it, and still am, but decided “what the hell?” and added it anyway.

Post and comment action menus now have a “See Votes” option that will search for the item at lemvotes.org.

Since this is an external service, the only guarantee I can make is that the correct AP ID is being sent. Whether it finds the content or is working is out of my control.

Note: Right now, it loads in a modal in an iframe. If that tool ever changes to prohibit embeddng in an iframe, it will have to be turned into an external link.

Mod/Admin Tools

Banning/Unbanning Multiple Communities

In the previous releases, you could only ban a user from a single community or all communities. This is now more granular, and you can select individual communities for the actions. The expiry, remove content option, and reason are used for all actions as before.

Local User Management

In Admin -> Local Users you can now list your instance’s users. Since this is limited to what I can do with the /api/v3/search endpoint, the only sorting opitons are Old and New. You can also search for a local user from within this section.

Use Cases

  • Keep an eye on new signups. It will show the number of posts and/or comments they’ve made
  • Take action against or interact with an account. Clicking their username will open the User Profile Modal for their account giving access to various tools.
  • Check the status of any local account

Send a Welcome Message During Registration Approvals

You can now opt to send a welcome message via DM to newly approved accounts as part of the application approval process. Send a “welcome aboard” message, a getting started guide, or anything you feel might help new users get up and going with their account.

A default welcome message can be configured in Settings -> Moderation -> Welcome Message (similar to a default registration denial message). There’s a button on the welcome message field in the application approval screen to populate it with this canned message.

Search for Alts in the Registration Application Menu is Now Localized

Rather than the “Search for Alts” button taking you to the search page in the previous releases, it now loads in a modal so you do not have to leave the application page.

Additionally, you can click on any alt from the results to load that alt’s user profile modal in order to check post/comment history or modlog history. Very useful for vetting new accounts before you approve the application and doesn’t require leaving the application workflow.

Set Site Content Warning

Both the field to set the content warning contents and a method of displaying it were both missing in prior releases.

As of 1.5.0, if any text is saved to the “Content Warning” field, then a modal will appear for all users the first time they visit the site. The modal will be shown in place of the UI until the visitor acknowledges it.

Defederate (or Re-Federate) Instances from the Instances Page

Rather than manually putting instance domains into the admin panel, admins will see a “Defederate” or “Re-Federate” button on instances listed on the /instances page.

LemVotes User Histories

Admins have the option to see a user’s history at LemVotes. This is useful for identifying suspected manipulation accounts which have been more prevalent lately.

Notes on Filtering Behavior

The filters behave differently for mods and admins in order to prevent blind spots. As such, some capabilities are reduced or disabled depending on your account role and where the content is posted. “Posted” here means either a post or a comment.

Mods

All filtering is bypassed in communities you moderate. If content is posted to a community you moderate, it will be neither filtered nor hidden. If you want to stop seeing content from specific users, you will need to ban them from the community. If you want to avoid specific topics, you will need to make a rule against it and enforce it.

Admins

There are two types of admins the filter subsystem handles, local admin and remote admin, and the behavior differs depending on which applies to a given submission.

Local Admin: A local admin is defined as an admin account that is on the same instance as the submission. e.g. If you are an admin of example.com, then any content posted to a community that resides on example.com will treat you as a local admin as far as filter processing is concerned.

For local admins, filters are bypassed for content in any local community, and items will not collapse into a stub nor be hidden. Content from remote instances, however, can be filtered (collapsed to a stub) but NOT hidden.

Remote Admin: A remote admin is defined as an admin of one instance while the content comes from another. e.g. If you are an admin at example.com and the content is federated from foo.com.

For remote admins, content from federated communities can be filtered (collapsed into a stub) but NOT hidden. The reason for this is that admins should have full visibility of content they are platforming, and if they don’t want that content, they should remove it. Admins are responsible for their instances and what (and who) they platform, so the filtering system will not hide anything from them.

These distinctions and limits on the filtering behavior are intended to prevent moderation blind spots. If you want to browse your instance while being able to fully utilize the filters, you will need to do so from an unprivileged alt.

What is not yet working?

  • Group import/export. You can currently import/export your groups along with the rest of your settings, but you can’t export/import groups separately (in the Settings -> Groups manager). Currently work-in-progress.
  • The option to save Tesseract settings to Lemmy is removed. The button is still there, but it doesn’t do anything and I just forgot to remove it. With the addition of the granular filter policies and user tagging, there’s simply too much data to try to shove into the theme field in the profile.

Given lemmy.sdf.org’s unreliability as of late, I figured I’d just create new communities for both 80s and 90s TV. I’ve had several things I’ve wanted to post to both recently but the sdf.org had been down since early April. It came back up briefly, but when I started to post something earlier, saw it was down yet again.

So, here’s alternatives if you want them.

@wesker@lemmy.sdf.org if you’re out there with a working alt and want to mod these, just give me a shout.

Note: The post image is relevant and will be explained further below.

New Features

LemVotes + Tesseract = A New Matchmaking Service ❤️

We’ve partnered with the fine folks over at lemvotes.org to create a new feature to help build lasting friendships in the Fediverse.

When you downvote something, it will poll LemVotes to see who else downvotes that same item. Over time, it will build up a list of profiles who hate the same things you hate and will show you a list of potential new best friends based on your shared dislikes.

Figure 1: A modal window showing a list of potential best friends based on shared downvote history

Figure 1: A modal window showing a list of potential best friends based on shared downvote history

Now More Privacy Conscious Than Ever

Are you tired of people recognizing you? Tired of people being like “Hey, I recognize that account! They’re good people, and I enjoy their posts” ? Boy am I sick of that.

Well, problem solved. In this and future releases, all accounts are ephemeral. Every time you vote, make a post, or reply with a comment, it will create a new disposable account while deleting the old one. Say goodbye to meaningful social interactions and get your troll on!

Figure 2:  A test user's post history showing each post made from a unique and deleted account.

Figure 2: A test user’s post history showing each post made from a unique and deleted account.

Rendering Images is Hard - Now They’re All Samuel L Jackson

For a long time now, Tesseract has jumped through hoops to try to determine the best image to display from the data in the post objects (thumbnail, full-res image, embed_video_url that’s actually the GIF you’re trying to post, etc).

In this release, we’ve simplified that process greatly. All image posts are just Samuel L Jackson staring motherfuckerly at you. Not only did this change massively streamline the codebase, but it also is much more efficient due to being able to cache a single image and re-use it indefinitely.

Figure 3:  A cute cat trying to help its human type on the computer.

Figure 3: A cute cat trying to help its human type on the computer. Awwwww ❤️

Sending Nudes to Admins is Now Much Easier

This is actually two new features:

  1. There’s a “Send Nudez” button tacked onto the bottom of the site info in the sidebar where you can upload a nude and it will send a DM to each of the instance admins.
  2. The signup application response has been replaced with an image upload button to send a nude in lieu of responding to the questionnaire.

Figure 4:  A not-at-all tasteful nude of me, Admiral Patrick, illustrating the "Send Nudez" button in action.

Figure 4: A not-at-all tasteful nude of me, Admiral Patrick, illustrating the “Send Nudez” button in action.

Upgrade Instructions

Upgrading is automatic and mandatory. No action is required on your part.

Update: I’ve patched out that joke and redeployed, so shouldn’t be an issue anymore. Will try to avoid any last minute jokes going forward.

You can turn the April Fool’s Day gags off under Settings -> General -> Enable April Fool's Day Jokes

I thought it would be funny to replace all the ths with the thorn character but forgot to account for inline links in the markdown text. So links to, say, https://thebutton.lemmy.zip/ are turning into broken https://{thorn}ebutton.lemmy.zip/.

This gag was a last-minute addition that wasn’t thought out fully, so my bad. Good thing this version is still an alpha 😜

Post Image: Depicts the new search scoping using the inline keywords to set the search options without having to use the search form manually.

I’m slowly wrapping up the feature list (very slowly) but alpha 6 is up and live now.

Hosted Instance: https://tesseract.dubvee.org/

Still no ETA on official release as I’ve got lots more to wrap up and many irons in the fire, but it’s stable for what’s working.

Alpha 6 Changelog

Since alpha 5, I’ve made the following changes:

  • Change Github icon to Codeberg
  • Add missing field in admin area to set the site’s content warning
  • Make the content warning a one-time acknowledge and show it before rendering any of the main UI
  • Add a “show source” / toggle markdown button on posts/comments to be able to view the raw markdown without having to go into debug tools.
  • Add some April Fool’s Day fun stuff even though I likely won’t have this officially released by then. At least people using the hosted instance will get a laugh.

Search Scoping

Added the ability to scope the search to “Local”, “All”, or “Subscribed”.

Added keywords to set those inline and expand the other search keyword filters.

  • @all: Searches all (unscoped) and is the default if omitted. I’m not sure why I added this since it’s not very useful.
  • @me: If the query contains @me it will scope the search to only items you’ve posted/commented
  • @local: If the query contains @local it will scope the search to only local items (works for users/communities as well as posts/comments)
  • @subscribed: If the query contains @subscribed it will scope the search to only items to which you are subscribed to the communities (including the communities themselves).

These can also be combined with the existing search term keywords!

Search prefixes to set the search type. You can now prefix the search query to set the search scope from the search box:

  • user: {query}: Searches only for users with the given query string
  • users: {query: Alias for user:
  • community: {query}: Searches only for communities with the given query string
  • communities: {query]: Alias for community:
  • post: {query}: Searches only for posts with the given query string
  • posts: {query}: Alias for post:
  • comment: {query}: Searches only for comments with the given query string
  • comments: {query}: Alias for comment:
  • url: {query}: Searches only for posts which have the provided URL as the post link

Examples:

  • @me @local comment: Captain Picard will only search for comments you’ve made to local communities containing the text “Captain Picard”
  • @local comment: Captain Picard will search for any comment containing “Captain Picard” only on local communities
  • @local users: Picard will search for any local users that have “Picard” in their username or display name
  • @subscribed posts: Picard will search only communities to which you are subscribed and return only posts containing “Picard”
  • posts: picard @subscribed @local @me will search for any posts containing “Picard” and scope it to only posts you’ve made to local communities to which you are subscribed.
  • @local communities: Star Trek will search for any local communities that contain “Star Trek” in their names.
  • communities: Star Trek @subscribed will search for any subscribed communities that contain “Star Trek” in their names.
  • communities: Star Trek @subscribed @local will search for any local subscribed communities that contain “Star Trek” in their names.
  • @local url: https://example.com/foo/bar.html will search only local posts with the given URL.

You can set all of these in the search form, but it’s very convenient to be able to type them into the search at the top and set them all inline.

I’m the Tesseract dev, and in the current build, any posts that aren’t your own that have [spoiler] (case-insensitive) in the post title will hide all but the post’s metadata (title, author, community, etc) and the vote/comment bar. Clicking “reveal” shows the post’s contents.

The nitty-gritty implementation details are up to you, but can we, as a group, please come together and handle this flair consistently? I would really love to be able to disable the “Show NSFW” option without missing totally safe-for-work posts due to people abusing the NSFW attribute. I get why people do that, but I’m also tired of playing “porn or spoiler” roulette.

I haven’t added this part yet, but I’m planning to put a “Spoiler” toggle on the create post form which will add [Spoiler] to the post title during the submission if the user didn’t add it manually.

Or if other apps I’m not familiar with are already doing something like this, let’s do that. Either way, let’s get on the same page.

Edit: If there are any other special-case flairs that might be handled similarly, I’m all ears.

I told you it wasn’t vaporware! By every stretch of the imagination this should probably be version 1.5 rather than a point release, but that may still change.

This is the longest stretch between updates, and I apologize, but I just needed to take some time away from…this. It’s not finished yet, and not everything made it into the cutoff, but it’s stable and feature complete enough to push out as a mature alpha / near beta. This is to allow some extra eyes / bug reports while I work to button everything else up. As far as stability goes, I always daily-drive the dev version, so everything I use works at least “good enough”.

It’s not generally available yet, but it is deployed to the hosted instance at https://tesseract.dubvee.org/


Notes Regarding Filtering Terminology

In the previous releases, “hide” was used to mean “collapse” or “minimize” but still show the content. In this release, “filter” means to minimize/collapse into a stub (you can click to reveal it) and hide actually hides the content completely.

Admins cannot fully hide anything with filters. If you’re an admin and you set it to hide any content, it will always be minimized. This is to prevent blind spots. Similarly, moderators cannot fully hide things in communities they’re in charge of.

Highlights

There are far too many changes to list in a post, and the changelog is a fustercluck right now, but here are the highlights:

  • Lots of visual tweaks and refinement
  • LOTS of bugfixes
  • Upload Manager: You can now manage your uploaded media from Profile->Media
    • View all your uploads
    • Delete an upload
    • Favorite certain uploads for quick reference later
    • Search for the post/comment where the upload was used
    • When posting/commenting, you can select select an image from your existing uploads
    • Use a custom upload as a custom emoji (not fully implemented yet)
  • Secondary Toolbar Can Be Hidden: The secondary navbar can be toggled on/off to give more vertical space in the app.
  • Defederation Indicator: Community cards will indicate if your instance is defederated from the community’s home instance. The create post and other action buttons will also be disabled if that is true.
  • Blind Voting: When blind voting is enabled, scores will be hidden until you’ve cast a vote. This encourages you to both vote/participate as well as to vote based on the content without being influenced by the current score. Admins can also set blind voting to be the default if they want.
  • Post Reply Muting: You can now mute replies on up to 25 posts. The option is available from the post action menu (three dots at top of post). Any replies to those posts will be silently marked as read and not included in the notifications. You will still see those replies in the inbox, but they’ll be marked as read leaving your “unread” inbox clean for replies you are interested in. Muted posts have a “Muted” badge in the title to indicate that reply notifications will be discarded. This also applies to comments on the muted post. For example, if you comment under a post and then mute replies to that post, any replies to your comment will also be muted.
  • Mentions and Private Messages Can Be Disabled: Well, not fully disabled. However, if you disable them, they will be silently marked as read and not trigger the notification indicator. They will also be hidden in the inbox. However, you can still see them if you turn them back on or access your account from another client.
  • Mentions, Replies, and DM’s From Filtered Accounts Do Not Trigger Notifications: They will be silently marked as read in the background, not trigger the notification indicator, and be hidden in the inbox.
  • Search Revamp: The search page has been revamped and no longer tries to be “too much”.
  • Search Prefixes: You can prefix your search to set the type. to set the search type. You can now prefix the search query to set the search scope from the search box:
    • user: {query}: Searches only for users with the given query string
    • users: {query: Alias for user:
    • community: {query}: Searches only for communities with the given query string
    • communities: {query]: Alias for community:
    • post: {query}: Searches only for posts with the given query string
    • posts: {query}: Alias for post:
    • comment: {query}: Searches only for comments with the given query string
    • comments: {query}: Alias for comment:
    • url: {query}: Searches only for posts which have the provided URL as the post link
  • LemVotes Integration: It was requested to add a LemVotes link to posts/comments. I was initially against it, and still am, but decided “what the hell?” and added it anyway. The post and comment action menus now have a “See Votes” option that will search for the item at lemvotes.org.
  • Enhanced Filtering: Too much to explain. Just look at Settings -> Filters and see what’s there.
    • Filter users and communities by actor ID or Regex pattern
    • Filter content by platform
    • Filter out entire instances (including wildcards such as *.example.com to cover lemmy.example.com and piefed.example.com
    • Filter by domain (including wildcards)
  • Settings Revamped: The settings and quick settings have been combined into a configuration panel with a tabbed interface.
  • Admin Panel Revamp: The admin panel has also been refreshed to be easier to navigate.
  • Community Groups:
    • Can have their own filter policies
    • Can minimize or hide all posts to them
    • Groups can be used as community flairs
  • New Font: I added Atkinson Hyperlegible because I’m absolutely in love with that font.
  • Block Management: Managing your user, community, and instance blocks is now easier. You can search/filter them as well as use the meta search term !banned to see which ones are banned and, optionally, remove them from your blocks.
  • Allows adding accounts from multiple instances by default. Previously, it was locked to the deployed instance by default, but now it requires the admins to set an env var to disallow adding off-instance accounts.
  • So much more under the hood (see release notes when this is released).

Known Bugs

  • Import and exporting groups from Settings->Groups is not implemented yet
  • The "Tags’ panel in the settings is not yet implemented
  • Adding a user/community to the filter exceptions exempts them from all rules. During testing, this was not found to be not desirable and only a subset of rules should be exempted for those.

What’s Removed?

  • Legacy Loops support. Loops now has proper embed URLs in their metadata so rather than re-write the shim for old Loops posts, I just took it out. Posts linking to Loops posts should just work unless they were posted before Loops released their current UI.
  • Save / Load Settings to Lemmy API. With the addition of the filter policies, expanded community groups, and other settings you can store, it’s just too much to store in the theme field in your profile. I’m brainstorming a way to save settings to your Tesseract instance, but that’s probably not going to be in this release.

What Didn’t Make the Cut?

  • Deezer embed support
  • User tagging (the settings tabs are there for it, but it has a placeholder

When Will it Officially Release?

Not sure. Depends if any major bugs are found during the alpha/beta phase and how much time I can devote to wrapping everything up.

Tesseract supports multiple accounts on different instances, but it’s locked to the configured instance by default.

I’m considering changing that to be unlocked unless configured otherwise. However, I’m unclear if people are just deploying it in the default configuration or genuinely prefer it be locked to only their instance.