Tesseract

72 readers
6 users here now

Tesseract: An Advanced Lemmy Client

The goal of Tesseract is to address as many things in Lemmy that annoy me as I can. I also trawl various "is there any way to [blank] in Lemmy?" posts to get feature ideas. Both of those lists are pretty extensive, so Tesseract has accumulated quite a few features.

Github: https://github.com/asimons04/Tesseract/

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

Note that the hosted instance defaults to Lemmy World, but it is unlocked to be able to connect to any Lemmy server.

Announcements, support, and guidance for the Tesseract UI.

All instance rules apply here. Beyond that, just be civil and constructive.

founded 1 year ago
MODERATORS
1
5
submitted 13 hours ago* (last edited 3 hours ago) by [email protected] to c/[email protected]
 
 

Finally have a feature-freeze on 1.4.30 and am in the final shakedown phase and fixing last minute bugs. If anyone would want to or be willing to run the beta and report any bugs, it would be appreciated.

Docker Tag: ghcr.io/asimons04/tesseract:1.4.30-beta.1


Bugfixes

  • "Moderator View" listing type was broken

  • Better truncation of modal titles

  • The comment button on posts in the feed did not respect the "Open posts in new tab" setting.

  • Flairs should now detect if there are spaces before or after them in the post title. e.g. Check this out [Video] wouldn't have rendered [Video] as a flair since there was a space after.

  • Works better with Lemmy's stupid federated image proxy URLs; updated image/video/audio detection functions to account for that stupidity

  • Tesseract's (less stupidly implemented) image proxy can now handle more weird CDN formats if it has to un-proxy a thumbnail URL from Lemmy's stupid federated proxy URL

  • Custom emoji's weren't respecting aspect ratio

  • Nested list items were broken; added a regex to detect those and not trim those lines during pre-processing

  • If no spoiler title was provided, the default fallback "Spoiler" wasn't being applied

  • Re-ordered post type detection scripts so posts with embed_video_url aren't erroneously rendered as image posts (e.g. Imgur...somtimes)

  • Field for alt text shows up in post form if API is 0.19.4 or higher (was previously set for 0.19.5 as the minimum)

  • Don't attempt to mark dummy/preview post as read

  • Previewing content in modals is now properly contained when maximized (videos, embeds, etc)

  • Iframe link previews (previewing a link that allows access via iFrame) are now screen height (well, 80% to account for the modal wrapper/button bar).

    • Since Wikipedia doesn't provide useful metadata, those always open as iframe, even on mobile where the iframe button is removed. These now render much better since they're nearly full height instead of relative to the screen width.

Minor Changes: Posts

  • On 0.19.4 or higher, you can now upload a custom thumbnail on posts

  • Post embed descriptions tweaked a bit

    • Link metdata title is truncated unless the description is expanded
    • Description text area is now a scrollable div when expanded (max 20vh) rather than expanding in full
    • Simplifed logic that truncates the non-expanded text
    • The whole embed description is collapsible
  • Badges that are clickable now have visual indicators on hover

  • "Old" and "Controversial" comment sort options now available

  • Too many minor tweaks to name individually (consequence of re-writing the post renderers)

Minor Changes: Feed

  • Moved listing type and sort selectors out of sub-navbar and into feed component

    • Similar to where they are in user profiles
    • Makes state management in the main feed much less clunky since it's not having to watch and sync 3 potential ways to set those
  • Feed snapshot validity is now configurable (between 5 minutes and 4 hours)

  • When expanding a post body in the feed, it only expands to a maximum of 50% of the viewport height and scrolls. Prevents opening a huge wall of text which requires a lot of scrolling in the feed to collapse again. This behavior can be turned off in the settings.

  • Scrollable area in the feed now includes the margins. i.e. you don't have to scroll over the actual posts to scroll the feed anymore.

  • Got rid of the feed margin container and just limit the width of the posts directly; width is toggleable with the same "Expand Margins" button and emulates the old behavior. Posts are slightly narrower now, but they're more consistent when resizing the window and less likely to need to expand the margins in odd, small width displays.

  • New view option: Wide Card (Card View + No Margins)

  • Moved the listing type and sort direction dropdown menus out of the sub-navbar and into the feed.

Minor Changes: Media

Images

Post images, audio, and videos now have a background with a blur effect.

Audio / Video Player

  • Volume and loop setting is now saved and re-used on subsequent videos and audio posts
  • Music files (ogg, mp3, wav, etc) now have a custom audio player rather than the default HTML5 one.
  • Audio player supports:
    • Custom thumbnail: Will use this as the "cover art"
    • Alt text: Will add a title to the audio player using this value.
    • Title attribute: When embedding an audio file in markdown in the image format, this can be used to provide a URL to set custom thumbnail/album art.

See example at: https://dev.dubvee.org/post/dubvee.org/2625894

All Media is Now Click to Play

It's much more memory/network-efficient, most people don't seem to have embeds always enabled anyway, it doesn't work with Invidious/Piped, and some media has to be click-to-play (Loops, Dailymotion) for various reasons/limitations.

Making all media click-to-play has also greatly simplified the render logic.

The non click-to-play logic has been removed as well as the settings for handling those options.

New Features

Support for Some Tidal EmbedsLinks to Tidal albums, tracks, and playlists should now embed as interactive playlists. As with other embeddable media, you don't need to use any kind of special share link; just the link from the browser tab.

When clicking a Tidal link in the comments (or choosing 'Preview' from the post action menu on a Tidal post), the link preview modal will also show the album or playlist as an embed.

Posts and Comment Threads Can Now Load in ModalsBy default, posts open to the post page same as they always have. In addition to optionally opening them in a new tab, you can now load them in a modal.

The setting is in Quick Settings -> Open Posts in Modal or Settings -> Feed -> Open Posts in Modals

This is nice if you want to open posts and read/respond in the comments without leaving the feed.

Additionally, on comment items in the inbox and user profiles, there is a button to jump to the comment thread in a modal. Very useful for getting context without leaving your current spot.

Report items also have this ability in order to easily get context before making a mod decision on an item. It will even bring up the whole comment thread in the modal if the reported item is a comment.

Behavior Overview

  • When viewing a post in a modal, clicking the title will take you to its /post/ page (even if it's a remote post)

  • The modal does not automatically resolve foreign post/comment links to your home instance. It first loads it remotely, and there is a button to load it on your home instance. This could be automatic, however:

    • It may be an item your instance doesn't know about
    • The referenced item's creator may be banned on your instance
    • The referenced item may be on an instance yours doesn't federate with
    • You may want to see the full context from the post's home instance
    • If someone links to a comment, it avoids having to double-resolve the post and that particular comment. It also provides context by having the whole comment chain rather than just the comment in isolation (e.g. if your instance doesn't have record of it yet).
  • If you click into another post from within the modal (e.g. cilcking a crosspost item or another linked post), it will keep a history and back/forward arrows will appear in the top-right of the modal title bar. Use these like you would a browser's back/forward buttons to return to previous entries.

  • Even with the "Open posts in modals" option disabled, cilcking the badge-ified post/comment links will open those in a modal. Useful for referencing what was linked without leaving your current position.

  • The post/comment badge buttons are also regular links. Right-clicking and choosing "Copy Link" or "Open in New Tab" work as you would expect. Middle-clicking also will open them in a new tab.

Limited Server Side Rendering (SSR) to Support Metadata FetchingA bug was submitted that when posting a link that resolves to a Tesseract resource (e.g. https://tesseract.dubvee.org/post/lemmy.world/123456), the metadata would be the generic Tesseract info rather than the metadata for the content. I had been content to leave it at that (Photon and Alexandrite both behave the same way), but I figured I'd give it one more go.

Tesseract is fully client-side rendered, and I'm not a huge fan of SSR in general. That said, sometimes SSR is useful (like for providing metadata to non-browsers), but every "correct" way I've tried to implement partial SSR has met with failure.

What ended up working, and working quite well, is less SSR and more heavy use of server-side hooks to redirect non-browser user agents to an internal API route that returns a bit-banged, minimal HTML document with the meta tags populated for post, comment, user, community, and site details.

Which is fun because it, like Tesseract's other internal API endpoints, runs on top of my home made Express-like router framework that runs inside the SvelteKit server hooks.

It's not pretty (though it is elegant), but it works. At some point, I'm going to be basically re-writing the whole application in either Svelte 5 or React (haven't decided yet), and I may explore a more SSR-oriented design at that phase (or not).

Metadata is Generated for the Following: I have metadata generating for:

  • /post/[instance]/[post_id]
  • /post/[post_id]
  • /comment/[comment_id]
  • /u/[username]
  • /u/[username@instance]
  • /c/[community_name]
  • /c/[community_name@instance]
  • / (Metadata for the default instance)

Support for Instance-Agnostic Links

TL;DR: I've implement this client-side.

Added support "universal" links as well as badge-ifying links to posts and comments.

  • @<user>@instance.xyz: Has been implemented since at least 1.4.0 (forget when)
  • !<community>@instance.xyz: Has been implemented since at least 1.4.0 (forget when)
  • #<post_id>@instance.xyz
  • ~<comment_id>@instance.xyz

Lemmyverse Link SupportLemmyVerse links will now be localized without having to hairpin to/from Lemmyverse. After being localized, they will be processed as if they were a regular-style link.

e.g. A LemmyVerse link will automatically/transparently turn into a user, community, post, or comment badge button and have the same abilities as first-party links.

Post and Comment Links are Now Badge-ifiedLinks to posts and comments (e.g. cross-posted from https://instance.xyz/post/12345) are detected, localized, and badgeified the same way as user and community links.

Additionally, like users and communities, posts and comment badge links will now open in a modal for quick reference without leaving your current spot in the feed or another post.

Clicking the post title will take you to the /post page for the item.

The post/comment badge buttons are also regular links. Right-clicking and choosing "Copy Link" or "Open in New Tab" work as you would expect. Middle-clicking also will open them in a new tab.

ScreenshotsClicking a Wikipedia Link Loads it in an Iframe

Clicking a Wikipedia link loads it in an iframe

2
 
 

I'm incorporating this as a client-side feature in 1.4.30: https://github.com/LemmyNet/lemmy/issues/2987

API support is irrelevant as the tools needed to make this work already exist, and are already in use (e.g. user and community links and the localization of remote post/comment links).

I've had user and community links working that way for many releases now, and in this release, I'm extending it to posts and comments.

User/Community links already auto resolve and bring up modals with actions for them. Currently, the new post/comment universal link handling is just a fancy button link that supports an extra couple of formats, but I plan to add a bit of extra functionality to them (though maybe not in the initial release).

When you go to a "foreign" post or comment in Tesseract, there is a button to load it on your home instance. I've not made that automatic because it's often useful to view posts on other instances (e.g. your instance has banned the creator, your instance doesn't federate with the instance of the post, etc).

I've also added icons to the badge buttons in this release.

Questions

  1. Now that there are icons on the badge buttons, should the colors be unified? If so, which color?
  2. Should post/comment links open a post view (basically an embedded version of the post page) in a modal?
  3. Should clicking these links automatically resolve the post/comment on your home instance, or leave it a manual process where you see it fetched remotely and can then load it on your home instance if desired?
3
 
 

Hi All,

First of all, love this UI for Lemmy and the functionality it brings!
Thanks to all involved!

I have 3 questions regarding Tesseract and perhaps people here can help or explain things.

Is there a way to have the margins disabled in Card view?
Right now I always click that button “Disable margins” to achieve this.
Would be nice to not to have to do the same default action every time.
If I use the view “Wide compact” or “Reader” then the margins disappear automatically.
If the “Card” view would have this option (or generally this offered as an option for any view type) then that would be great.

Comments button does not open in a new tab, clicking on the link of post does open it in a new tab I have the option “Open Posts in New Tab” set to ‘on’.
My expectation would be that any click on a post would open that post in a new tab, comments button included.
Only votes buttons would not show this behaviour as that would not be the expected outcome I think.

When I am in a community (say c/[email protected]) and click the plus button to add a post, the community field is empty.
I would expect the community field to have “[email protected]” pre-filled.
You can search by typing in that field but it makes more sense to have it pre-filled if I am already inside a community.

4
 
 

In this version, I took the entire rendering pipeline apart, re-wrote most of it, and put it all back together. I'm quite pleased with the results. Different post types are easier to customize now and are less tangled together, the different players are more modular, and everything is just cleaner.

1.4.30 is not finished, but it's finally not in a million pieces scattered all over the place. Progress! That said, it is on the home stretch. There's a weird bug I'm also trying to squash, so I'll probably take a few days to test drive and see if that's fixed or not. Probably about a week out before this is ready, give or take a few days.

Aside from bugfixes, what's new?

Lots of UI Polish

The post/media renderers were all re-written and cleaned up significantly.

Limited SSR for Metadata Lookups

There is now server-side rendering when non-browsers do metadata fetches for posts against a Tesseract URL. So if you post a link to another post that points to Tesseract (e.g. https://tess.instance.xyz/post/instance.xyz/12345), it will no longer just return the generic Tesseract manifest data; instead, it will return the details for the post, comment, user, community, or instance.

Tidal Support

Tidal album, track, and playlist links are now supported and show as embeds. You can also click a supported Tidal link anywhere in the app, and it will embed in the link preview modal (same as how YouTube and other media will preview the video embed in the modals).

Post Form Now Allows Supplying Custom Thumbnail

If connected to an instance 0.19.4 or higher, you can now supply a custom thumbnail image when creating a post. Disabled if you're uploading an image or there is no URL supplied.

New Audio Player

The default HTML5 audio player was kind of boring, so I wrote a custom control interface around it and fancied it up. Has touch-friendly controls, will use the custom_thumbnail if available, and looks so much better. It also remembers the loop and volume level and uses that on other audio elements and videos.

With Custom Thumbnail Available

No Custom Thumbnail / Default Placeholder Image

Inline Player in Comment Section

Here, the comment used the media embed syntax (which does work in Lemmy-UI, surprisingly):

![](https://example.com/media/PublicDomainSong.mp3)

Now, the alt text is used as the title for the audio player:

The alt text, in a post or in the markdown syntax will be used as the title in the audio player. Additionally, in markdown, you can specify a thumbnail image for the audio by using the title portion of the markdown image format. For images, this is used to denote a custom emoji, but for audio, if it's a link to an image, it'll be used as the player image.

e.g. ![Jenna Maroney - Muffin Top](https://files.catbox.moe/qpakxa.mp3 https://dubvee.org/pictrs/image/fd0ca66e-e9ef-493b-9e01-5ea0867f19ca.webp

![Audio Title](https://example.com/audio.mp3 https://example.com/thumbnail.png)

Confirmed this is backwards compatible with Lemmy-UI (it ignores that on audio).

5
 
 

Thanks for the great work! Especially since I've been looking for a way to filter out keywords on desktop, without resorting to a mobile-first front-end.

6
 
 

When scrolling through the feed it randomly happens to skip a bunch of entries. It suddenly jumps far down the feed for no apparent reason.

Some observations and possible cause thoughts:

  • I believe it skips one load batch (20) of entries.
  • Scrolling up those entries gets me back to where I was in the feed.
  • I think it happens when the last entry of a previous load batch expands an attached media item.
  • It's more apparent in media heavy feeds.
  • It's independent of the scroll speed.
7
 
 

I've been re-writing all of the media renderers and decided that the default browser audio player was ugly. Figured I'd fancy it up a bit, and am probably also going to skin the video player as well.

This is the audio player. The thumbnail is the custom_thumbnail added when creating a post to a .mp3 file.

Still playing around with the layout, and will probably add a few more controls (playback speed, prev/next and support for multiple tracks, etc). The background image also animates during playback.

I believe it should be easy to provide a user option to prefer the default browser player, so I'll probably add that too.

8
 
 

Problem

One of the things that annoys me about Tesseract is that preferences, groups, and favorites are not synced between devices.

The user preference keys available in the Lemmy API don't even begin to scratch the surface of what Tesseract needs to store, so to date, it has only exposed the API-based user settings that affect the behavior of the API (show bot accounts, is bot account, return unread posts only, etc). Every other setting as well as groups/favorites, are stored in the browser's local storage.

For a long time, Tesseract has had a very hacky "solution" where Tesseract can (manually) backup and restore its settings to Lemmy by abusing the theme preference since it's a text column in the database (the settings get serialized to a JSON string and replace the value of the theme setting). That's typically how I sync my settings across devices. However, that's not ideal, breaks Lemmy-UI for your account until you restore it to a valid value, and is susceptible to the whims of the Lemmy devs who tend to break everything I try to do because "that's not how Lemmy-UI does things".

The other option implemented currently is manually downloading / restoring a JSON file and syncing that between devices manually.

Neither of those are great, but they do work.

Solutions?

I'm looking for a solution that would allow only authorized users to POST/GET their own user settings, etc while minimizing overhead for the user. Basically, I want it to be as seamless as possible. I've listed a couple of options on which I'm looking for feedback, possible gotchas, etc. Other suggestions are welcome as well.

Option 1: Utilize the Lemmy JWT

Send the Authorization: Bearer {JWT} header to Tesseract's internal API the same way it's sent to the Lemmy API.

Pros

  1. Least amount of overhead for end-users
  2. Seamless integration
  3. Easy to implement

Cons

  1. Some admins may not be comfortable plugging their JWT secret into a 3rd party app
  2. Would only work with the default instance Tesseract is deployed to
  3. If Tesseract is deployed "unlocked" to allow adding accounts from other instances, only the account on the "main" instance would be able to use settings sync.
  4. Would not work for a shared/hosted instance that's open to everyone

Option 2: DM-Based Auth Tokens

After a successful login (to any instance), Tesseract generates and sends a DM to the user with an auth token. That token would then be entered into the app settings (or perhaps picked up automatically by an app handler and automatically inserted?).

Pros

  1. Used by other Fediverse apps (Canvas and Fediseer, for example) and seems to be a valid method of cross-instance authentication
  2. Would allow multiple accounts on different instances to authenticate
  3. Relatively seamless if the auth tokens can be automatically intercepted and stored by the app itself (rather than requiring the user to copy it from the DM and insert it into the app settings).

Cons

  1. More complex; Tesseract doesn't currently have the ability to send ActivityPub messages directly, nor do I have experience on that front. Alternatively, the admin who deploys Tesseract would need to provision a "service" account on the default instance, and DMs would be sent via the Lemmy API.
  2. ???

Other Options

If you have any other suggestions, I'm all ears. Most of my experience with authz is in an enterprise environment (LDAP/OAuth) or with a single source of truth for user accounts. I try to never half-ass authz implementations, and this is no exception. If I can't make it secure and relatively seamless for the user, then I won't implement it at all.

9
3
1.4.29 Released (dubvee.org)
submitted 2 weeks ago* (last edited 2 weeks ago) by [email protected] to c/[email protected]
 
 

1.4.29

Note: I fixed the typos that are visible in the screenshots (they were all taken when I was in early testing)

This release brings bugfixes, proper rendering of custom emojis, and enhanced UX during the login process. Also, admins can now preset a template to be used in registration application denials.

Bugfixes

  • Tweaked font sizing a bit so that H3/H4 heading differences are more pronounced.

  • Added meta header to instruct Dark Reader to ignore the app. It's got automatic and manual toggle for dark mode (system preference or manual toggle), and DR doesn't render it correctly when it's enabled.

  • Code spans inline with ! and @ community/user links cause the user/community links to not render

  • Opening outside links in the same tab and returning back was causing lifecycle issues

    • Outside links now always open in new tab, "open links in new tab" option has been removed (open posts is new tab is still available though).
  • Collapsing/Expanding the sidebars no longer collapse/expand inbox/report/application items to the default state

  • Add route at /registration_applications to redirect to /admin/applications so the link in the "{User} has applied to join {instance}" emails from the API work if Tesseract is replacing Lemmy-UI.

  • When updating community info/settings, any cached getCommunity details for that community is updated.

  • Custom emojis are no longer treated the same as regular markdown images. Now display inline at 24x24 px.

New Features/Enhancements

Favicon Uses the Instances's Icon

Favicon uses the instance's site icon rather than the static Tesseract logo. Automatically changes if you switch instances and falls back to the Tesseract logo if no site icon is available.

Custom Emojis Are Now Rendered Properly

I had been content to let custom emojis be treated as regular images since many instances just use them as quick selectors for reaction GIFs (mine included). However, it was requested that I handle them properly, so I finally am. One bonus is that even though they're tiny now, they're still zoomable if you click on them.

If you want it to appear as a regular image, just remove the "shortcode" from the link URL:

  • Before: ![A sign language interpreter making a jerk-off motion and rolling their eyes.](https://image.url/1.gif "jerkoff")
  • After: ![A sign language interpreter making a jerk-off motion and rolling their eyes.](https://image.url/1.gif)

Better Login UX

Now has cleaner error messages if there is an error during login:

  • Invalid username/password
  • Invalid / expired / missing TOTP token
  • Modals with additional info for non-standard login errors (registration pending/denied, banned)

| Invalid User/Pass | Invalid TOTP | |


|


| | | |

Registration Application Deny Reason Now Shown During Login

If a user whose registration application was denied attempts to log in, instead of a generic toast error message, a modal will pop up informing them that their application was denied along with the reason provided.

The reason is rendered as markdown, so if you include links for appeals, follow-ups, etc, those will be actionable.

Registration Pending Indicator During Login

If a user tries to log in while their registration application is pending, instead of a small toast error, a modal will pop up with a more detailed and user-friendly explanation.

Banned Indicator During Login

If someone has been banned from the instance, instead of a generic login failed toast, a modal will pop up with a more detailed explanation.

The modal will also try to fetch that user's details from the modlog to display whether the ban is temporary or permanent, the reason, and, if temporary, the expiration date.

Admins Can Now Set Application Rejection Preset Reason

In Settings -> Moderation, admins will see a new section called "Registration Application Deny Template". This allows you to pre-set a reason for registration application denials that can be one-clicked into the deny reason on the Applications page.


Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.29
  • ghcr.io/asimons04/tesseract:v1.4.29
  • ghcr.io/asimons04/tesseract:latest

Links

10
 
 

Affected Versions: 1.4.21 - 1.4.28

Problem

Clicking an outside link from the feed and opening it in the same tab brings you back to an empty feed requiring a full refresh of the app.

Details

Navigating to an outside link in the same tab is treated the same as refreshing the page. This triggers, among other cleanup tasks, the memory optimizations that flush the feed, but, after navigating back from an outside link, the page is not triggering the handlers to re-create the feed.

Workaround

From the feed, click the Gear icon to load the quick settings. Enable the option "Open Links in New Tab".

Fix Status

There are a few ways to fix this, but removing the memory optimizations from the "refresh" handler is the easiest. I'm testing that in dev right now. I have other optimizations which may make these redundant, so if I am able to remove them, it both solves this issue and simplifies the code.

If those are needed, then I'm going to have to come up with another way to detect a page refresh that doesn't also trigger when navigating to an outside link (or at least some clean way to differentiate the two actions).

11
 
 

The post image shows Tesseract in dark mode with the Dark Reader extension active. It's not supposed to look like that lol. In the SpaceX post, the text should be legible with a gradient effect, but DarkReader breaks that. Also, the borders should not be anywhere near that pronounced.

This is how it's supposed to look in native dark mode

Tesseract Dark Mode Proper

Native light mode + Dark Reader looks kind-of okay (I may even adjust the native color scheme to be closer to that), but it still breaks the gradient effect on collapsed post previews and makes some buttons appear disabled:

You can disable Dark Reader on a per-site basis, and it's recommended to do so for Tesseract. Customizing the native themes to work better with Dark Reader is obviously not a priority since there is a native dark theme already lol.

Edit: I found there's a way for the app to tell Dark Reader to disable, and I have that added to the dev branch. I'm working on making that "disable" header dynamic, but for now, I'm fine with statically disabling it.

12
4
1.4.28 Released (dubvee.org)
submitted 3 weeks ago* (last edited 3 weeks ago) by [email protected] to c/[email protected]
 
 

1.4.28

This release brings a few bugfixes and several quality of life improvements. Also, mods are now able to see the votes on submissions to their communities (if their instance is on 0.19.4 or above).

Bugfixes

  • [Bug/Annoyance] When highlighting text in the markdown editor and using the toolbar buttons (e.g. highlight a word and click "bold"), the text area would annoyingly scroll to the bottom. No longer does it do that.
  • [Bug] Default moderation template had a missing piece (community) and didn't really make sense.
  • [Bug] Don't poll notifications from Notification system time handler if no active profile. The poll function didn't actually run, but no reason to call it if no profile
  • [Bug] Usernames in direct message headers was improperly truncating

Minor Changes

  • [Settings] Moved inbox/notification related settings to new section in /settings page.
  • [Notifications] Notification poll interval is now configurable
  • [Infrastructure] Removed unused settings key for notificaiton rate
  • [Infrastructure] Can now specify section URL param on /settings page to open the specific panel (useful for linking to a settings section; yet to be implemented elsewhere)
  • [Direct Messages] Updated the message header to be more email-like

Vote Viewer Now Available to Mods

If connected to an instance running API 0.19.4 or higher, the vote viewer is now available to mods for items in their communities. I had always planned for it to be, but I wasn't aware that had been implemented in the API already. Apparently it's been available to mods at the API-level since 0.19.4 (thanks @[email protected] for pointing that out).

For those unaware, the vote viewer is accessible from the Moderation Modal -> View Votes... button.

Posts

All User Defined Invidious/Piped Instances Available

The link menu / alternate source selector for YouTube-like videos now lists all user-defined Piped/Invidious instances instead of a single, static link to the currently-selected instance.

Community Profile Modals

Post Drafts Less Likely to be Accidentally Lost

When creating a post in the community profile modal, the "Return to Home" back arrow will now prompt you for confirmation if there is anything in the post form. Helps prevent accidental loss of post draft via mis-click.

Upload Cleanup

When clicking the "return to home" button from the "Create Post" panel, the resetForm function from the post form will be called which will take care of cleaning up any uploaded media that would otherwise be abandoned.

Markdown Editor

Added new buttons to the toolbar

  • Insert User Link
  • Insert Community Link
  • Table
  • Code Block
  • Formatting Help

The "Insert User/Community Link" buttons will let you search for a user and/or community and insert links to them in the body at the current cursor position. The inserted links are in the @[email protected] / [[email protected]](/c/[email protected]) format. Inline auto-complete is in the works but needs to bake a little longer.

The "Table" button will create a markdown table template.

The Code Block button is a menu which will let you select the lanaguage (or plaintext/other).

The Formatting Help button will load a modal with a markdown cheatsheet.

Toolbar Now Reflows

The markdown editor toolbar (with the formatting, emoji, image, etc) buttons will now reflow on mobile/small width screens rather than scroll horizontally.

Various Tweaks to Markdown Editor

  1. Heading button is now a menu; can select headings 1 through 4
  2. Fixed bug where highlighting text and using the toolbar buttons would always scroll it to the bottom
  3. Numbered and bullet lists now give you three entries
  4. On spoiler, code block, and lists, the cursor now goes to inside the block or in position for the first list item (respectively)
  5. Highlighting text and clicking the "Link" button will now automatically put the text into the link label. For example, if you highlight the text "Home" and clicked link:
  • Old behavior: Home -> [Label](url)Home
  • New behavior: Home -> [Home](url)

Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.28
  • ghcr.io/asimons04/tesseract:v1.4.28
  • ghcr.io/asimons04/tesseract:latest

Links

13
2
1.4.27 Released (dubvee.org)
submitted 3 weeks ago* (last edited 3 weeks ago) by [email protected] to c/[email protected]
 
 

This release brings bugfixes and a few small feature requests.

Bugfixes

  • [Regression] The 'Filter Annoying CC Licenses on Comments' option wasn't working since the markdown pre-processor re-write.
  • [Bug] Ensure post titles are not linkified. This includes both regular URLs in the title (typically flotsam from Mastodon) and unwanted mailto:[email protected] email links when the titles contain [[email protected]](/c/[email protected]) or @[email protected].
  • [Bug] Dynamically import separate CSS themes for HighlightJS depending on app theme. Makes code blocks easier to read since the default styling assumed light theme.
    • Known Quirk: Unfortunately, this is not reactive to changing the app theme without refreshing the page.

New Features

Misc

  • Added "RemovePaywalls.com" as an option in the archive link selector

Inbox and Reports

Can now set an option to expand inbox and report items by default.

  • Settings -> General -> Expand Inbox Items by Default
  • Settings -> Moderation -> Expand Reports by Default

Can now configure how many inbox and report items are retrieved per page.

  • Settings -> General -> Inbox Items Per Page
  • Settings -> Moderation -> Report Items Per Page

Both have new sidebar buttons to expand/collapse all

Registration Applications

  • Can now set an option to expand all registration applications by default. Settings -> Moderation -> Expand Applications by Default
  • New sidebar button to expand/collapse all applications

Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.27
  • ghcr.io/asimons04/tesseract:v1.4.27
  • ghcr.io/asimons04/tesseract:latest

Github: https://github.com/asimons04/tesseract

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

14
5
submitted 3 weeks ago* (last edited 3 weeks ago) by [email protected] to c/[email protected]
 
 

1.4.26

This release brings bugfixes, ability to upload videos, and new moderation capabilities.

Bugfixes

  • Add /reports route that redirects to /moderation so the email links from the API work correctly if you're using Tesseract in place of Lemmy-UI as your default frontend.
  • Add moderation button to crosspost items
  • Long links in the modlog were not wrapping when reflowing to mobile
  • Pause markdown videos/audio when leaving viewport instead of destroying (same as how post videos are now handled).

Bugfixes from 1.4.25

Didn't do a post for 1.4.25, but there were only some minor bugfixes in that release.

  • When viewing a user's submissions in the profile modal from a /c/community page, the post meta is hiding the community and treating inCommunity as true.
  • Removed code to switch between community icon and user avatars in CommentMeta component since that's actually useless since you can't browse just comments in a community.
  • Comment card colors were not reactively updating when user was banned with content removal from site/community
  • When removing/hiding a community, the local cache of the community details was not updated to reflect that; had to open the app in a new tab to get a new session in order to fetch it again. The cache now updates on block/unblock/hide/unhide.

New Features

Support for Video Uploads

Less a "new feature" and more a bugfix to canonize a feature I didn't realize already existed and mostly worked lol.

The file upload handler sets the supported MIME types, but it has no way to enforce them (it's more a suggestion to the browser). A user reported that they forced a video upload, and it worked, but the process was buggy. This was a surprise since I'd never actually tested or even thought about supporting video uploads.

So I patched up the upload handler to support video/mp4 and video/webm formats. The previewer will only show the first frame as if it were a static image, but it will no longer glitch out. It will also automatically disable and hide the "Pre-convert to webp" options if a video is detected.

I'm not sure how useful this will be since most instances limit upload file sizes or disallow videos, but if you're on a supported instance, hey, you can do videos now.

Edit/Clarification: You've always been able to link to a video. This addition allows you to upload a video to your instance's pict-rs as you would an image.

New Moderation Capabilities (aka Troll Buster 5000)

Added support for community moderators and admins to issue bulk community bans/unbans. For several releases now, Tesseract has had the ability for mods (or admins) to directly ban/unban a user from a community (Community Modal -> Ban/Unban User -> Enter username -> Ban/Unban).

Now, there's an extra option to allow issuing either action in bulk for every community you moderate.

Highly useful if a known troll is roaming about (you probably already know which one I'm talking about) and you want to quickly ban them from all of the communities you moderate (whether they've posted there or not).

I'm all about being proactive, so if a known troll is making rounds, I see no reason for them to have to make a mess first when I can simply prevent the mess (or further messes).

Example: You're scrolling /all and see some vile, racist troll posts from a brand new account. Rather than having to wait on an admin to ban them or waiting for them to hit your communities before you can do anything about it, you can simply click their username and [pre] ban them from everything you moderate. Easy peazy.

Basically, every time "that guy" goes on a trolling spree, Tesseract's mod tools adapt and get more powerful. A less polished version of this feature has been in my "private" build for a while now, but since "that guy" shows no signs of buggering off, I figured it was time to mainline it and give everyone else the same defensive capabilities I've thus far hoarded for myself.

Note: Please do not use this feature as an "I really don't like this person" button. In the wrong hands it's got high potential for abuse, I admit, but the benefits it offers outweigh the risks of a few bad mods going on a power trip.

This is a powerful feature. Please use it responsibly.

If time passes and it seems like I've handed loaded guns to a bunch of toddlers, I'll absolutely yank this feature and move it back to my private build.

Modes of Operation

It works a little differently depending on where it's invoked and whether you're a moderator and/or an admin.

In all cases, the expiration date, reason, and whether to remove content applies to all communities (i.e. the API is called for the same user with the same options and loops through the list of communities you moderate).

User Profile Modal

New option in the user profile modal to ban/unban that user from all of your moderated communities. Available to Mods + Admins

This button is also available in the Moderation Modal as well as the quick actions on the moderation reports.

Ban Instance Modal (Admins) With Option to Ban from all Remote Communities They May Moderate

For admins, there's a new option in the "Ban User..." form to "Ban All Remote Communities". Will issue community bans for all remote communities you may be moderating in addition to the instance ban for your home instance. The "remote" filter is to avoid spamming the modlog in case you're an admin of a large instance (technically you moderate all local communities you're subscribed to).

Community Profile Modal:
The "Ban/Unban" option has been extended to allow optionally banning/unbanning the supplied user from all the communities you moderate. Available to Mods and Admins.

Here, the user is not pre-populated and you can enter the username in any of the following formats:

While "Ban" is the action shown in the screenshots, these work in reverse as well to unban them from all. The only thing that's not automated is restoring content if "remove content" was selected during the initial ban. I'm working on that, but there's no clean way to do it without restoring everything, even things that were removed prior to the ban action. As always (since this is the case for all UIs with mod tools), take care when selecting "Remove content" when issuing bans.


Note for admins: Since you technically moderate all communities on your instance, it will only issue bans for communities on your instance that you are subscribed to. The preferred flow for admins is to just instance ban them and select the option to "Ban All Remote Communities" if needed/applicable. Care should also be taken to not select that if they violate a local instance rule but not a remote community/instance rule.


Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.26
  • ghcr.io/asimons04/tesseract:v1.4.26
  • ghcr.io/asimons04/tesseract:latest

Github: https://github.com/asimons04/tesseract

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

15
2
1.4.24 Released (dubvee.org)
submitted 1 month ago* (last edited 1 month ago) by [email protected] to c/[email protected]
 
 

1.4.24

New: Documentation for Mod Tools

I'm (slowly) getting documentation / screenshots written up now that the basic UI paradigm has stabilized. Until now, only the server config/deployment is thoroughly written-up.

The first area of documentation for the frontend is for the mod tooling.

See: Documentation - Mod Tools

Misc Bugfixes

  • Prevent unwanted "scroll to top" behavior when previewing a post.

  • Comment image backgrounds were the same color as the alternate card color in light mode. Set the image background a shade darker

  • Fixed bounding in Community Settings -> Team user items in the moderator list.

  • Hidden communities were being filtered out; the documentation/description for what hide community actually does is vague, but hiding a community seems to hide it when non-admins list/search communities and prevents them from showing up in /all. Users already subscribed or those going to the community pages directly should still be able to see them.

  • Wide tables now scroll horizontally instead of overflowing outside the page bounds

  • Stupid invalid user/community link formats break the UI when clicked (e.g. [anything]([[email protected]](/c/[email protected])) and/or [anything](@[email protected])). Even though "thEy WoRk iN lEmMy Ui !1!1!!!" they're not valid hyperlinks and should not be used. However, I have shimmed the handlers so they don't break things.

  • Rendering of user/community links stopped if there were more than one in the same line of text.

Bugfix + Enhancement: More Markdown Pre-Processor Optimizations

In the previous release, I started breaking the markdown up into smaller pieces and processing it line by line. This worked much better than trying to grok it all as one big blob and allowed me to simplify my regex patterns significantly.

In this release, I've gone one more step and am breaking the lines apart and processing text word-by-word. This extra granularity has allowed me to further simplify regex patterns and address a few shortcomings such as missing a render when two user/community links were on the same line.

The main benefit here, aside from better and more consistent rendering, is that it has greatly reduced my reliance on regex look-behinds which are not widely supported.

Tweaks and Enhancements

Modals

Could probably call this release "Modal Mania" because of all the work they've seen.

The modals were already horizontally responsive, and I wanted to make them veritically responsive as well. They already kind-of were, but it was inconsistent in places. This required a significant refactor / overhaul of the main modal component which underpins all of the different modals.

Refactored most of the system modals to take advantage of the changes.

Misc

  • When browsing a community or user's submissions in their respective modals, the modal is now taller and has scroll to top/bottom buttons for convenience.
  • When searching a user's submissions from the moderation modal, the search is now scoped to the community relevant to the mod modal.
  • Increase gap between parent comments and parent->children comments in comment section.

Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.24
  • ghcr.io/asimons04/tesseract:v1.4.24
  • ghcr.io/asimons04/tesseract:latest

Github: https://github.com/asimons04/tesseract

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

16
 
 

1.4.23

This is a minor feature release. Nothing new for regular users, but there are some new capabilities and major improvements for admins to make handling registration applications easier and more powerful.

See: https://github.com/asimons04/tesseract/issues/9 for additional context and screenshots.

Bugfixes

None discovered since 1.4.22 :)

New Features

Tweaked Admin Area

Got rid of the sub-navbar menus to select which admin section is active. Now uses a button bar like is used in the user profiles.

New Registration Application Manager

What started off as simply adding a text field to the registration applications so the deny reason could be recorded turned into just flat-out re-writing the whole registration application manager.

It makes me sad that I think this is a cool feature update and very few people will actually see it or know it exists lol.

Changes include:

  • More compact/dense as it now uses the inbox / report form factor (expandable accordions)

  • Much needed visual / design overhaul

  • Can now specify the reason when denying an application

  • There's a button which will let you search for alts of the same username. Very useful if you want to see if they're instance hopping and want to check if they're a good fit for your instance. Also useful to see if someone is spinning up lots of alts rapidly (e.g. spammers).

  • A colored badge on each entry indicates the application's status:

    • Pending action (Grey)
    • Approved (Green)
    • Denied (Red)
  • Option to create a modlog entry when approving/denying the application. Disabled by default, accessible via button and/or toggle.

    • Denying an application creates a "ban user" event using the deny text as the reason. This is useful in case denial emails are still not being sent out and the user wants to check their application status.
    • Approving an application will intelligently unban a user if they're banned (i.e. from a mistaken denial).
    • Approving an application with a modlog entry will be a user un-ban (even if they're not banned, it'll still log it)
    • Approve unban message is Registration application approved.
    • Deny ban message is Registration application denied: ${REASON_YOU_SUPPLIED}
  • More information about the applicant:

    • Signup email address
    • Whether the email address has been verified
    • Whether the signup email address is to a known disposable/temporary email provider

Other UI Tweaks

  • Crosspost items have less padding and rounded borders now

Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.23
  • ghcr.io/asimons04/tesseract:v1.4.23
  • ghcr.io/asimons04/tesseract:latest

Github: https://github.com/asimons04/tesseract

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

17
5
submitted 1 month ago* (last edited 1 month ago) by [email protected] to c/[email protected]
 
 

1.4.22

This is a small maintenance release; trying to get back to my original plan of more frequent smaller updates. A few bugfixes were committed as well as some general UI polish.

New Features

Community groups have been added to the "My Communities" menu in the top navbar. This makes them accessible from mobile or if you want to keep the sidebar collapsed but still have access to the groups (as well as favorites/ subscriptions).

Bugfixes

  • Videos are no longer destroyed, just paused, when scrolling out of viewport
  • Better truncating of user/community links
  • Better width bounding to go with the truncation fixes
  • Previewing a community in a modal while on the /c/{community} page of another community would override the modal's settings and show the community from the page route.
  • Fixed Community Menu (from top navbar) overflowing in Firefox
  • Added Loops to the hybrid view configuration panel to allow them to optionally always render as cards
  • Title on /site page was still set to "Legal".
  • Add missing tooltips on user and community links
  • Text was not flowing around the thumbnail image in compact view

Tweaks

  • Comments
    • Comments now use a card effect with alternating shades depending on the depth
    • Changed/standardized how the comment coloring is performed (jumped-to comment, distinguished, removed, etc)
  • Community Groups
    • Added the community groups to the Community Menu in the top navbar
    • Updated the community group management components
  • Sidebar
    • Decreased x-axis padding in the sidebar
  • Misc UI
    • Link metadata thumbnails now remain the same height and only change width with the viewport width.
    • Updated several areas to work better with the updated community/user links
    • Reversing the action bar direction no longer reverses the vote button ordering (i.e. upvote stays on the left, downvote on the right)
    • Tweaked crosspost item component

Get Tesseract

Docker

  • ghcr.io/asimons04/tesseract:1.4.22
  • ghcr.io/asimons04/tesseract:v1.4.22
  • ghcr.io/asimons04/tesseract:latest

Github: https://github.com/asimons04/tesseract

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

18
 
 

A month or two ago, when Dubvee was down for a while, I noticed that my self hosted instance of Tesseract (pointed to my Lemmy instance) was also not working. I could browse it just fine, but once I would try to sign in, I believe the problem was that it would just infinitely load. That made me rather wary of using Tesseract at all, wondering how tied it is to your personal infrastructure. Can you ease my privacy-focused mind on what happens to my credentials when I attempt to log in?

19
7
submitted 1 month ago* (last edited 1 month ago) by [email protected] to c/[email protected]
 
 

1.4.21

Overview

This release could probably be considered 1.5.0 rather than a 1.4.x point release, but I'm going to wait until I raise the minimum supported API level before bumping the minor version. Currently, I do have support for 0.19.4+ features, but they're limited to a few minor things here and there (see README.md for specifics). I've also added the capability to automatically enable/disable features that require different API versions, so I'll likely be adding some more 0.19.4+ user-facing features in the coming releases. The newer admin/mod features, if any, will need to wait until my own instance is updated past 0.19.3 since I will be unable to test those (I can test the user-level stuff against a different instnace with one of my alt accounts there).

Most of the work in this release has been re-writing core components, getting rid of some legacy stuff, and stanardizing any redundant sections with shared components. All of this is to make the upcoming task of porting to either Svelte 5 or React easier (haven't decided which yet; I'm annoyed that Svelte has so many breaking changes. We also use React at work which is more stable in the long term).

Bugfixes

  • Added missing padding on placeholder initials if there is no site logo

  • If replying to a post/comment removal via a comment reply, send the reply before removing the item otherwise the reply will fail. (when I wrote that in the 0.18.x days, you could reply to removed comments and I just never used that feature since the behavior changed in 0.19.x)

  • When switching instances or loading the site info for another instance into the site sidebar, the taglines would sometimes get stuck on the previous instance's values.

  • Images would fail to render if @[email protected] or [[email protected]](/c/[email protected]) were in the alt text since it would trigger the pre-processor to convert them into user/community links.

  • Memory optimization hacks; good lord Svelte is a hoarder and refuses to let go of shit. This is a huge reason why I'm probably going to port Tesseract to React instead of going to Svelte 5. Even if the memory leaks are fixed in Svelte 5, they basically turned it into React anyway, so might as well use that.

  • Fix bug where overlap in hashtags (e.g. #Photography and #Photo) would mangle the longer tag.

  • Markdown inside of code blocks is no longer pre-processed. This should fix quirks when viewing code snippets and some of the includes get incorrectly turned into hashtags. It also let me simplify some of the regex patterns since they no longer have to account for code blocks with look aheads/behinds.

  • Linking to a community on another instance (e.g. if you want to show the community on that instance rather than just linking to the community) no longer turns into a community action badge.

  • Bugfixes for bugs introduced during the rewrites have been omitted, but a lot of time was spent tracking those down and squashing them.

Bugfixes for Image Loading and Image Proxy

For efficiency, Tesseract tries to request webp versions of non-animated images at sizes appropriate for their use. e.g. 128px for icons, 256 for thumbnail images, etc. Usually this works, but sometimes remote pict-rs gets all pissy about it. Before, this would cause the image to fail to load until opening it with the Zoom which requested the raw image URL. Now, I've added error handlers for images to fallback automatically/gracefully:

[Desired Resolution and Format] -> [Desired Resolution] -> [Raw URL at default resolution] -> [Static Placeholder Image]

Similarly, if media proxying is enabled, it will use the same fallback path but via the image proxy. Depending on the user-defined fallback behavior, it will either try the raw URL or return a placeholder image.

I've also added apng animated PNG to the list of supported images.


Guide: Optimizing Browser Settings for Tesseract

When using "click to play" on media posts (the default setting), the "autoplay" flag is implicitly set on the embed to prevent you from having to click multiple "play" buttons. However, any player besides YouTube (e.g. Invidious, Piped, PeerTube, etc) requires you to click the video again after it switches from thumbnail to embed. This is annoying, and YouTube only seems to get a default pass in Chrome/ium because Google says so.

To remedy this:

  • In Firefox, this mostly works with the default settings and no settings changes are needed. However, you can set the site permissions when a media tries to play (can't seem to get to that setting otherwise?) and change autoplay to "Allow audio and video" if needed.
  • In Chrome(ium): In the Tesseract tab, go into "Site Settings" and change Sound from "Automatic (Default)" to "Allow". This is very counter-intuitive, but it does address the problem.
  • If running as a Chrome(ium) PWA, the app permission settings will be at: [Three Dots Menu] -> App Info -> Settings -> More Settings and Permissions

New Features

Initial Support for Loops Videos

This has been a feature request since Loops first went live, and I finally came up with a satisfactory way to integrate Loops media. The media itself is easy to integrate. The problem is that the metadata returned for a Loops video link does not include the video URL, and there's no way to derive the video URL from the available metadata. In some cases, I can use the thumbnail image and massage that into a working video link, but more often than not, the thumbnail URL was to a pict-rs cached image rather than the value returned from Loops.

Right now, the Loops support is very "beta" but functioning well. There are a few limitations:

  • It can break at any time if Loops decides to go user-hostile and block non-browser requests via Cloudflare or something. Tesseract does a server-side lookup to basically scrape the video URL and then caches that for re-use.

  • It can also break if Loops decides to crack down on "hotlinking" the videos.

  • It only works with the main loops.video domain. For now, this is fine since Loops hasn't released its stack for self-hosting yet. Like Piped/Invidious, I'm basically going to have to have a list of Loops instances to detect. While this is great for decentralization, it's a huge pain in the ass when you want to make a nice client to integrate with them all.

  • Loops videos are not "eligible" to always shows as embeds and must use click to play. This was a choice on my end to avoid hammering Loops with requests for videos that may or may not be watched. The lookup to get the video URL is only invoked when you "click to play" from the post thumbnail image.

  • I've reached out to the Loops team to see if they would add the oc:video tag to the page metadata so the embed video URL can be obtained properly without such hacks. If they ever do add that, then the integration should work cleanly like with PeerTube and without the clunky requirement to have a list of known Loops instances and then scraping the video URL from those.

Alt Text Now Supported in Post Form

If the connected Lemmy instance is on API 0.19.5 or higher, the post form will now have an "alt text" field if the URL points to an image or video (uploaded or remote URL). If the URL is not an image or direct video, or the API is below 0.19.5, the alt text field will not show up.

When crossposting, the original alt text will be used if present; you can edit it as desired/if needed.

Under the Hood Highlights

  • Storage Compression: When data gets stored to sessionStorage, it's compressed first. This has yielded quite a bit of savings and is a workaround for the 5 MB per-key limit on local and session storage in the browser. 5 MB sounds like a lot when it's all text data, but since there's a lot of redundancy in the data returned from the API (e.g. two posts to the same community will each have a full copy of the community details, sidebar info, etc), it fills up fast when you're taking snapshots of the current state (which his how Tesseract keeps your position in the infinite scroll feeds). In the future, I plan to move to IndexedDB which does not have this limitiation and comes with additional benefits. The current plan is to use PouchDB as the wrapper library which opens the door to syncing with a Couch DB add-on to Tesseract's server component and allowing state to be maintained across devices :)

  • More Caching: For data that doesn't change often, such as site and community info, the loaders have been updated to first see if there is a cached record for that data. If so, it will be used to fulfill the API call. If not, it's requested from the server as before and cached until needed. Currently, site (local and remote) and communitiy details are cached. I'm looking into other places data can be cached, perhaps with a shorter validity period.

  • Initial Support for 0.19.4+ API Functions: Tesseract is still designed for 0.19.3 as its baseline. However, I updated the JS client to the latest one for 0.19.7 since it's backwards compatible. While I don't have all the newer features built-in yet, I do have some that become available when the API level supports it.

Preview Community and User Feeds in Modals

You can now view a user's or a community's feeds in their respective modals when clicking a user or community link.

The preview has also been added to the moderation modal. However, in the moderation modal, it limits the feed to just the user and community relevant to the item that initiated the mod modal. e.g. if you click the mod button for a post/comment in the FoodPorn community by user Bob, the only submissions that will be shown are Bob's submissions to FoodPorn. This should help with performing mod actions as you can check for patterns of rule-violating behavior without having to leave the mod tool.

Another use case is previewing new communities when you click on a pill-button link. e.g. if someone comments about a cool community and uses the [[email protected]](/c/[email protected]) format (as they should), you can click on it which will resolve it automatically. From there, you can click "Browse Community..." to see what kinds of posts it has before commiting to subscribing (okay, that's a very tiny commitment, lol, but you get my point).

New Feed Capabilities

The feeds were re-written as components to be more modular and consistent. Mostly, if I did my job right, you won't think I did anything at all. That said, they do have a few new tricks:

  • Feed filter options for "Show Only [Liked | Disliked | Saved] Posts".
  • Feed filter options for "Show Hidden", "Show NSFW", and "Show Read Posts". Requires 0.19.4+ for show hidden and 0.19.6+ for "Show NSFW" and "Show Read"
    • Those options will be hidden if the instance is below the required API version.
  • Can hide/unhide posts; accessible from the post action menu (three dots, top-right). Requires 0.19.4+.
  • Better state preservation. The snapshot subsystem has been overhauled, and the data is now compressed before being stored into session storage
  • Refreshing the browser will now clear the snapshot for the current feed and re-fetch from the API. i.e. refreshing the app/page will pull the data from the API as expected instead of reloading a stale cache / requiring to manually press the app's refresh button.
  • Manual pagination is now bi-directional. You can page back without having to use the browser's 'back' button.
  • Switching between communities will remember your position and sort options in each (until the snapshot expires. Currently 15 minutes)

UI Tweaks

  • Clicking a community link to bring up the modal will now allow you to browse the community from within the modal (nice for previewing communities)
  • Clicking the @[email protected] in the user profile modals will copy the username to the clipboard
  • New vote buttons
  • Redesigned comment count button on posts in feed; now shows unread count
  • Redesigned crosspost container
  • Moved thumbnail image to the left on link previews
  • Moved 'debug' button into post/comment action menus (removed dedicated button)
  • Instance names in the site cards are now clickable. Eventually they will open an instance modal with nice options (similar to user and community modals), but for now, it just goes to /site/{instance} to view the instance details in a nice page (rather than a cramped sidebar).
  • Clicking "Home" in the sidebar will take you back to your previous scroll position.

Moved More Menus Out of the Sub-Navbar

I still like the UI element, but too many of the options got moved into dropdown menus in the sub-navbar. Based on feedback, that seems to have sacrificed function for form. In this release, I've moved many of the selectors closer to the elements they manage.

  • Community Browser instance selector, sort, and type menus have been moved above the community list.

  • The sort and type selector menus in user profiles have been moved into the feed component itself.

  • In the Inbox, the subnavbar elements have been removed completely, and there is a sidebar to the left of the inbox (similar to an email inbox)

  • In the Moderation/Reports area, the subnavbar selector has been removed; like the Inbox, there's now a sidebar with the relevant filtering options.

  • The main feed still has them in the subnav bar, though, since there's plenty of room on the left-hand side.


Removed Features :(

Only Specific Forms of User and Community Links are Turned into Action Badges

There's so many wild and inconsistent ways people reference communities and users. I originally tried to cover them all, but there were too many edge cases, overlaps, and times it's not desirable to do so that it became impractical.

Now, only three forms of user/community links will be turned into action badges; the rest will remain unmodified links or plain text.

Valid Community Link Examples:

Valid User Link Examples:

No Longer Valid / Won't Be Badge-ified:

The https://instance.xyz/c/[email protected] format was removed because sometimes it is useful to link to a community on another instance to see differences due to federation, moderation, etc. In those cases, changing it to a local link is not desirable. The rest were removed because they were proving problematic to support with all the different ways people make user/community links.

As of this release, only the formats in the valid lists above will be matched and turned into action badges (load the modal for info about the community/user). Other formats, or ones that are already linked, won't be touched.

Note that the ! and @ formats do not need to be manually linked in most Lemmy clients.

Browsing Favorites / Groups as a Feed

This capability was always experimental. The initial implementation wasn't great, but it worked well enough, and I had a plan to improve it. Unfortunately, before I could put that into motion, the Lemmy devs, in their infinite "knows better than everyone else / if Lemmy UI doesn't use it, no one should" wisdom, removed the post ranking metrics from the API. This meant I could no longer do any kind of sorting beyond score and date.

So, since then (0.19.0 or thereabouts), the custom feeds feature has remained in place, crippled, and begging for death. In 1.4.21, I finally decided to put it out of its misery.

Community groups and favorites are still available, but they're only used for organizing communities now. Favorites give you quick access to your most-visted communities, and groups are still useful to keep tabs on your subscribed communities.

I do have a plan to resurrect the feature, but it's going to require backend support. I have a partial Tesseract API server, but I've not worked on it in a good while. Even still, if I do dust that off and go that route, custom feeds will only work for the "default" instance Tesseract is deployed to and only if the admin runs the API service for it. Not sure how practical that will be, but since it's something I would want to offer on my own instance, I may still work toward it, though at a low priority.

Option to Disable Automatic Timestamp Updates

I changed the way the timestamps on posts/comments, etc update. Prior to this release, each had its own setInterval in the component and operated independently. In this release, I introduced a system timer that dispatches events at an interval. The date components now simply listen for this event and recalculate. With this change, the option to disable them doesn't really provide any benefit.


Changes and Enhancements

Community Explorer

  • Moved listing type, sort options, and keyword search out of sub-navbar and into the "feed" area.
  • State is now maintained in the URL, so paging back and forward will keep the state correctly (it didn't maintain any state previously)
  • Calls to local and remote getSite are cached in session storage to reduce bandwidth (used to populate the site sidebar)
  • Tweaked the 'subscribe' buttons
  • Added a dedicated button to go directly to the /c/{community} page for each entry
  • Clicking the community name will open the community modal for additional options
  • The selected instance is now route-based rather than URL param or internal state variable. e.g. /communities/{instance}
  • Your home instance now has a "home" icon indicator in the instance dropdown

User Profile Pages (including local profile)

  • Uses the new, component-based feed rather than the bespoke one used previously.
  • User banner, stats, "about" info, and moderates list is now above the feed rather than in the sidebar (except local profile; that's still to the side except on mobile)
  • "Moderates" list is no longer a separate accordion. That list has been moved into the "About Me" section (similar to user profile modals)
  • Sidebar is now populated with the home instance details for the user (banner, icon, name, stats, admins, site description, legal, etc). Non-local profiles only.
  • Sidebar site info is now cached in the browser's session storage to reduce network traffic and load on remote servers
  • Better state preservation when navigating in/out. Right now, the snapshot validity is 5 minutes for user profiles versus 15 minutes for the main feed and communities.
  • Integrated search. No longer just a shortcut to the /search page with the user pre-set.
  • The sort options and type (posts/comment/all) menus have been moved from the sub-navbar to above the feed.
  • Lots of under the hood changes, none should be visible except what's listed :)

New Inbox

  • Looks/behaves much more like an email inbox
  • Inbox items are collapsed into accordions. Open to view the message.
  • Configurable default inbox: can be "all " or "unread". Setting is in Settings->General->Default Inbox
  • Collapsible side menu to switch between message types, all, and unread. Also has convenience pagination buttons. The "mark all as read" button has also been moved here.
  • Removed the dropdown menus from the sub-navbar; those are now in the collapsible side menu
  • The envelope icon to the left of the message container is the "mark as read/unread" button.

New Moderation/Reports Manager

  • Removed the custom buttons from the sub-navbar. Filters are now in its sidebar.
  • Now uses the same layout as the inbox
  • Has a sidebar for switching between unread/all and filtering by community. Also includes pagination.
  • The check button to the left of the collapsible report is the resolve/unresolve button. Green check = resolved, white check is unresolved.
  • Unread reports are bolded
  • Can filter reports by community
  • Removed the moderation action form since it's a brute to maintain and has received mixed reviews from users.
  • Each item has a few quick action buttons for mod tasks. Use the "All Mod Actions..." button to bring up the moderation modal to access all options.
  • Looks less awful on mobile :)

Known Quirks

  • Changing any of the infinite scroll options (or switching between infinite and manual pagination) requires any existing feed snapshots to be cleared. If you switch options from the quick settings menu, it will automatically refresh the browser as a workaround hack. If you switch them from the main settings page, you'll need to manually refresh the feed or the browser to clear them. Again, I have a way to deal with this, but I'm not certain it's the most graceful (though it's more graceful than force-refreshing the browser lol).

Twitch Videos (Not Possible)

I also had a feature request to support Twitch embeds. It seemed possible (they provide the video embed player URL in the link metadata), but I can't make them embeddable because Twitch cockblocks embedding except from the "big" social media sites. So, no Twitch video embeds for Lemmy, but not for lack of trying.

Refused to frame 'https://player.twitch.tv/' because an ancestor violates the following Content Security Policy directive: 

"frame-ancestors https://reddit.com/ https://www.reddit.com/ https://old.reddit.com/ https://new.reddit.com/ https://www.redditmedia.com/ https://twitter.com/ https://cards-frame.twitter.com/ https://tweetdeck.twitter.com/ https://discordapp.com/ https://discord.com/ https://embedly.com/ https://cdn.embedly.com/ https://facebook.com/ https://www.facebook.com/ https://vk.com/ https://x.com/".

Get Tesseract

Docker Tags:

  • ghcr.io/asimons04/tesseract:1.4.21
  • ghcr.io/asimons04/tesseract:v1.4.21
  • ghcr.io/asimons04/tesseract:latest

Github: https://github.com/asimons04/tesseract

20
 
 

This is probably the biggest feature-creep release to date (especially for a point release) lol. Most of the changes are architectural or subtle UI tweaks, so I wanted to include a few new things that would actually be noticeable.

Tesseract now supports Loops video embeds. 🎉

This has been an "ask" for a month or longer (or since Loops went live), and I'm happy to say I finally came up with a way to make this happen (Loops doesn't provide any video embed metadata so I had to get creative 😔)

As for a release date, I'm still running through tests since there were so many architectural changes this time around. If you want to help with this, please consider testing for me via the hosted instance (https://tesseract.dubvee.org/) and submitting bugs via Github or posting in this community with the bug details.

There are a few areas I wanted to touch up this release (search and modlog), but those are just going to have to wait.

Best estimate is next week assuming I don't hit any snags with the Loops integration. Again, testing and submitting buts is extremely helpful as I cannot test every possible scenario.

This feature brought to you by Crown Royal Vanilla flavored whiskey

21
 
 

This is a fairly large release packed with lots of UI refinements, removal of a lot of legacy cruft (though sadly not all yet), new features, better moderation workflow, and lots of bugfixes. This is probably the most overhaul the basics of the UI have seen in one release since the first versions.

Get Tesseract

Docker tags:

  • ghcr.io/asimons04/tesseract:1.4.20
  • ghcr.io/asimons04/tesseract:v1.4.20
  • ghcr.io/asimons04/tesseract:latest

Bugfixes

Bugfixes: Minor

  • May only have been an issue for admins, but administratively hidden and removed communities will now no longer show up in community autocomplete results.
    • They will still show up when filtering for a community in the modlog though (though only admins should be able to see those results)
  • Fixed full URLs not truncating properly when "Show Full URLs" option is enabled
  • Fixed issue with click-to-play not working on post pages if media is disabled on post pages.
  • Disable "reply" button if post is removed or deleted
  • Disable 'report' post action if post alredy removed (I think deleted posts can still be reported, though. Need to double-check the API behavior.)
  • Disable 'report' comment action if comment already removed.
  • Fixed Gifs not previewing if just 'url' is present (i.e. no thumbanil_url or embed_video_url)
  • Indicate post's removed/deleted/lock state in the comment item component when viewing profiles
  • When "Match Crossposts on Title" is enabled, posts with the same title but different URLs will no longer be erroneously rolled up
  • "Distinguish" now only shows on your own comments if you are a moderator. This matches the stupid API behavior because...the Lemmy devs don't listen to anyone. (Wow I really can't go one release without throwing deserved shade at them, can I?)
  • Modlog now shows hide/unhide and remove/restore community events.

Bugfixes: Major

Image Cache Housekeeping

Fixed image cache housekeeping not working correctly.

There were changes to fs/promises that I missed, and some functionality changed along with a few of the member variables being deprecated. This was causing the directory content calculations to silently fail safe (returned 0 rather than crashing).

As a result, nothing was ever getting evicted from the cache.

If you are using the cache functionality of the image proxy, you will likely notice that startup takes a bit longer this time if you have housekeeping set to run at startup (recommended). This is because it will be housekeeping all of the cached objects it should have been housekeeping all along. Once the initial cleanup of the backlog has completed, further startups should complete in the normal/expected amount of time.

If startup takes too long, you can always delete all of the .cache objects manually from the mounted cache folder. See the Media Proxy docs for configuration options.

New Features / Changes

"Hybrid" Post ViewRather than a binary choice of "card" or "compact", hybrid view will let you set a list of post types (image, video, article, etc) that you want to render as cards while displaying everything else as compact. This is the new default view.

This is useful, for example, to let memes and news articles co-exist without having to expand every meme image manually in compact view or view every article thumbnail card-sized.

The behavior and post types can be configured from Quick Settings -> Post Style -> Hybrid and then clicking the link for "Configure" -or- from Settings -> Feed- > Hybrid View Configuration

By default, only image posts are expanded to cards.

In addition to setting the types of posts that should render as cards, you can optionlly keep read posts collapsed into compact view when they would otherwise be cards if they were unread. This is enabled by default, but can be easily disabled.

There is also a new regular view called "Compacter". It is the same as compact but post body is fully collapsed. Similar to "More Compact" but not full width.

Post Form Now Automatically Searches for Crossposts/DuplicatesWhen you are creating a post, the URL will be searched to see if you're posting something that's already been posted. It should do this automatically when the URL field changes or the URL is set and the community changes. The behavior is slightly different depending on if a community is defined:

  1. If the community is not set, then it will search for any posts on your instance matching that URL. The label will be "Crossposts".

  2. If the community is set, then it will do a remote API call to search the home instance of that community for any posts to that community with that URL. The label will be "Existing posts".

The latter behavior is particularly useful if you want to avoid accidentally posting a duplicate that may have been posted by someone you've blocked or by someone your instance doesn't federate with. Those posts may not be visible to you locally, so the remote search should help identify them so you don't clutter up the feed and/or add extra work for the moderator who usually removes duplicate posts.

If for whatever reason it doesn't trigger automatically, the "Magnifying Glass" icon to the right of the URL field can trigger the search manually.

Also note that behavior #2 only works if you're posting to a Lemmy community since it makes a remote API call to the community's home instance using the Lemmy API. Thus, it cannot search a remote Kbin/Piefed, etc instance.

Can Now Vote on Crossposts Without Clicking Into ThemVote buttons have been added to the crosspost items, so you can now vote on them from the feed and post.

In the feed, since the cross_posts are rolled up manually from regular post objects, the voting works as expected.

Unfortunately, when clicked into a post, the API call does not add the my_vote variable to the cross_posts array. So while you can vote on the crosspost, and the vote will be correctly recorded, your vote will only display correctly while you're on that page. Since the API doesn't return the vote you cast, on refresh or subsequent loads, the vote button will not indicate which way you voted. If you try to vote again, the score will not necessarily change. Yet another feature I want to implement hampered by dumb API decisions.

DailyMotion Video Embeds Now SupportedI forgot Dailymotion existed until someone posted a link a while back. Upon inspection, they have an embed API, so I figured why not add support for it.

Moderation Menu Has Been Replaced With New Moderation ModalThe moderation menu on posts and comments has been removed. The reason is that the menus were getting cluttered when new things are added, especially for admins who have more options available than regular mods. Rather than creating sub-menus (yuck!) or introducing separate UI elements for admin controls, I've just scrapped the whole thing and started over.

The "mod" button will now open a modal containing all the mod tools that are appropriate for the item.

The cool thing about the new mod modal is that all of the tools are packaged into it. It doesn't open separate modals for banning/unbanning, removing/restoring, etc. It even has the community details available so that mods can reference the rules when issuing actions without leaving the item they're working with.

Current Capabilities and Features

  • A mini-banner heading showing the current community with its icon and the creator of the item and their avatar/info.
    • Both communtiy and user are clickable to bring up their respective profile modals to get more info (these pop up in separate modals and aren't integrated into the mod modal)
  • Pin/Unpin the post to the community
  • Feature/Unfeature the post on the instance (admins only)
  • Lock/Unlock the post
  • View the community details relevant to the current item (post or comment)
  • View the votes for the item (admins only until whatever version of Lemmy lets mods do this for their communities)
  • Remove/Restore the post or comment (shows the post meta header or the comment meta header and comment previews)
  • Send a DM to the post/comment's creator
  • Purge the post or comment (admin only)
  • Ban/Unban the user from the community
  • Ban/Unban the user from the instance (admins only)
  • Distinguish/undistinguish mod comments
  • View the user's modlog history
    • Defaults to their history in the community relevant to the current item
    • Can toggle between their modlog history in the community and their full modlog history
    • Also has link to the full modlog viewer filtered for that user.

All tools stay within the same modal, and it shrinks/expands to accommodate the various integrated tools.

Improved Community ModalsTo reduce clutter, the "Subscribe/Unsubscribe" (RSS Icon), "Favorite/Unfavorite" (Star), "Add/Remove to Group" (3 People) buttons have been moved to the modal title bar as icon-only buttons.

"Create Post" is no longer a link to the community's create post page. It now shows the create post form right in the modal. There is a button in the upper-right which will take you to the /c/{community}/create_post page if you want to use the old form ( 🖼️ 👩🏻‍🦰 🖼️ it's the same form).

For admins, "Remove/Restore Community" and "Hide/Unhide Community" have been integrated. They will also now prompt for an optional reason to show in the modlog.

The "Community Details" is now a panel (like in the moderation modal) rather than being an accordion. Same functionality, different packaging.

You can now view the community's modlog directly in the modal.

Added the direct ban/unban user tool to the community modal. Instance admins and community moderators can now manually ban/unban users from the community without having to dig up a submission. Useful to revisit an old ban or to ban a known troll making the rounds before they hit your community.

Improved User ModalsThe "Copy Lemmyverse Link" and "Copy Actor ID" buttons have been moved to the modal's title bar as icon-only buttons. - The "Share" icon is for Copy Lemmyverse Link. This is used to share an instance-agnostic link to a user. - The "Link" icon is for Copy Actor ID.
- The box with arrow in top right icon will take you to the user's profile.

Can view user's modlog history directly in the modal

Can send a message to the user directly from the modal

For admins, the "ban/unban user" form is now integrated directly into the modal.

Piped/Invidious Support ChangesSince YouTube has gone to war against alternate frontends (and is sadly winning), most public instances no longer work. However, I believe that private/small instances may still function as expected.

Since the public instances are pretty much all broken or only partially working, Invidious/Piped support has been modified to only be enabled if the user supplies their own instance.

The distinction between Invidious and Piped has also been removed since the link formats are interchangeable. Now, in Settings, the YT frontend has been changed to just "YouTube" and "Custom". The custom instance list can contain Invidious and/or Piped instances.

The alternate link selector for YouTube videos will now also only show "Invidious/Piped" option if you have defined at least one.

As before, multiple custom instances can be defined but one will need to be selected as the default. That one will be used for the alternate source selector and, optionally/separately, as the embed player.

Note: You can keep YouTube as the default embed player while also adding a custom Invidious/Piped instance to act as alternate links in the alternate source link menu.

The internal lists of public Invidious and Piped instances has been combined and are only used for detection; formerly, these could be selected as frontends.

On the admin side of things, the env var PUBLIC_CUSTOM_PIPED has been deprecated. For now, it will simply be combined with the PUBLIC_CUSTOM_INVIDIOUS list. Eventually the Piped list will be removed, but that is TBD. Those lists are also only used for detection and are no longer presented as possible frontends for the user to select. If a user wants to use Invidious/Piped, they must supply their own instance in their settings.

Lost, non-comprehensive list of various UI tweaks

  • Lots of UI polish all around. Too numerous to list individually.

  • Legacy user and community menus in /u/{user} and /c/{community} cards have been removed. The functionality has been moved into the respecctive user/community modals.

  • Community link pill buttons are now gray instead of orange. The orange was just...too much. User link buttons are still blue.

  • Better display of metadata from posted links

  • Cleaner compact view (also incorporates metadata display better)

  • Feed images are limited to a maximum of 40% viewport height. This still gives the nice "card" effect while also not making posts massive. They were formerly limited to 80vh, but even this is no longer needed since the ZoomableImage component was integrated.

  • Removed user settings for post and feed image sizes since they're no longer needed with the new compact and card view tweaks described above.

  • Post body images are now hidden in the feed and a link shown in their place. Clicking the link will open them in a preview modal. Unless the option to disable inline images is turned on, then they will still show as embeds when opening the post. This should help compact mode stay compact rather than some of them being massive with one or more post body images slipping through.

  • Direct video (mp4, webm, etc) posts now use the video metadata for the thumbnail if OP didn't post a custom one. Also works in compact view now.

  • Bandcamp embeds are now smaller.

  • All media renderers now show the embed metadata alongside the post details.

  • Direct audio links (MP3, etc) now have renderers; they only rendered in the markdown post body and comments previously. Now if the post URL is an audio link, a player will embed.

  • Show link selector, link, and MBFC even if metadata fails to load in preview modal. Also show that info while fetching metadata.

Better Error Handling and Integration with Pifed/Mbin/etcWhen clicking a link that goes to a post or comment, Tesseract will massage the URL to attempt to render it locally (extract the instance and post ID and do a remote API call to fetch it for local rendering). This works great for Lemmy, but non-Lemmy services which use the same /post/{id} and /comment/{id} URL format don't work with Lemmy API calls.

Before, this would throw a generic 500 "Failed to fetch post" error. The UX has been improved in this release by showing a clearer error message as well as a button to visit the post on its home instance.

Additionally, if a local post fails to load, there's now conditional verbiage to indicate a local post may have been removed by its creator or removed by a moderator, and there is no button to visit it on the home instance (since it is the home instance).

22
0
submitted 5 months ago* (last edited 5 months ago) by [email protected] to c/[email protected]
 
 

1.4.13

Docker Tags

  • ghcr.io/asimons04/tesseract:1.4.13
  • ghcr.io/asimons04/tesseract:v1.4.13
  • ghcr.io/asimons04/tesseract:latest

Bugfixes

  • [0ed97991] Don't badge-ify hashtags if the hashtag linkify option is disabled
  • [ce5a310a] Make markdown text reactive (and re-run pre-processing step) to changes to the enable/disable hashtag setting.
  • [704e2d78] When clicking the user/community links in the modal, close the modal when navigating to the target (previously modal stayed open)

Enhancements

  • [3b8ef653] Update banner when viewing a post on a remote instance to use more concise verbiage and add an extra button to link to the post's canonical instance.
  • [ec8c4bfe] User and Community links are now a elements rather than button. Allows middle-clicking or right-click-> open in new tab to immediately open the profile/community in a new tab without having to click through the modal. Regular clicks still open the modal.

New Feature: Synthetic View Modes

Under the hood, there are still only two main types of view: Card and Compact

However, Compact view is affected by several options which can be combined to create different view styles.

The "compact/card" switcher button has been replaced with a selector menu to select from one of 6 views:

  1. Card: The flagship Tesseract post view. Posts are shown as cards with all the media embed bells and whistles. Post body preview is set to 240 characters.

  2. Compact: The classic "compact" view as of 1.4.12. Feed margins are present, post images are thumbnails, the post body preview is 240 characters, and no media is embedded unless the post is expanded into card view.

  3. Wide Compact: Same as "compact" but without the feed margins. Posts span the full width of the display. Clicking the thumbnail image or the "expand" button in the post action bar will expand the post into card view.

  4. More Compact: Same as "wide compact" except the body preview length is set to zero and can be expanded.

  5. Ultra Compact: Same as "wide compact" except the thumbnails and the post body are hidden. Post body cannot be expanded, and you will need to click into the post to see it. Post can be expanded to card view only with the "expand" button in the post action bar. Expanding into card view does not reveal the post body, only the thumbnail image (if present). If the post is a media post, the embed will be available (either in full or click-to-play depending on settings)

  6. Reader: Same as "wide compact" except the entire post body is shown (up to 10,000 characters).

More views may be added along the way, but for now, those should cover more use cases without having to manually fiddle with the various options.

I'm really liking the "Reader" mode, myself.

23
1
submitted 5 months ago* (last edited 5 months ago) by [email protected] to c/[email protected]
 
 

This post sent from my dumb phone lol (including the image)

24
0
submitted 6 months ago* (last edited 6 months ago) by [email protected] to c/[email protected]
 
 

1.4.1 is mostly a bugfix / under-the-hood release, though there are some new things as well as several refinements to old things (see Misc Changes below).

This is the first of a few releases that's going to focus on addressing some feedback I've gotten that basically boils down to "too many buttons". I agree with that completely, and this release eliminates at least one of them.

Say Goodbye to 'Community Menu' and Hello to Community Modals

The "Community" menu button on posts has been completely removed, and all of its features (and more) have been moved to the newly created Community profile modal. When you click on the community name in the post header, instead of being taken to the /c/ community page, it brings up a modal with the community icon, banner, description, moderators, and a list of action buttons. It does for community links what the user profile modal did for user links in the last release.

Another benefit to this is allowing access to the community details / sidebar info while on mobile. It used to have that ability, but it was ugly and kludged on, so I removed it several versions ago. Now it's available again, and implemented in a way I like.

Community profile modal

Community profile modal with the community details/sidebar info expanded.

Moderators are shown in the bottom of the community details accordion.

Post Flairs

There's a new user option, enabled by default, that will extract any [tag] items from post titles and convert them into flair badges. Anything in [] in the post title will be converted into a flair tag, and the [whatever] removed from the displayed title.

Clicking a flair badge will perform a prepared search for other posts with the same flair (e.g. search?type=Posts&q=[tag]). They work more or less the same as hashtags do (if you have those enabled).

This had been half-implemented in a branch for some time now, but I wasn't sure if other front-ends were handling them in a similar way. Saw an post from the Photon dev saying they're adding them, and it's compatible with my implementation, so figured it was time to dust off that branch and merge it in.

It also supports nested flairs: if there are multiple, comma-delimited words in the brackets, each one will be applied as a flair.

Debug view showing original post title for the above:

1.4.1 Changelog

Infrastructure

  • Update SvelteKit from 1 to 2 and update underlying dependencies
  • Update other project dependencies to latest versions
  • Update NodeJS from 20 to 22
  • Update lemmy-js-client to 0.19.4 so latest features can be utilized.
  • Removed svelte/adapter-auto and only use Node adapter.
  • Remove some discrete, one-off logic and replace with shared/standardized components

Bugfixes

  • Fixed modlog action menus clipping
  • Fixed reactivity and blocked/unblocked status on profile modals and user pages. Added a call to getSite after blocking/unblocking to update person blocks list.
  • Fix mobile reflow in modlog
  • Fixed bug with non-default instance not showing site icon/banner correctly
  • Fixed bug with re-authenticating to the first profile (index 0 was getting ignored and creating a new profile vs reauthorizing)
  • Fix heading/icon in "Create" menu not being properly justified
  • Fixed bug when inline images are disabled, the link isn't shown
  • Fixed bug when refreshing profile page, sometimes the wrong comment data would be shown in the edit of another comment (added index to 'each' iterator)
  • Fixed bug where setting the guest instance required clicking it twice to update the site info / logos.~~~~

New Feature: Community Profile ModalsWhen clicking on a community in the feed, instead of taking you directly to the /c/ community page, a modal will pop up with relevant options for the community. Works the same way as the user profile modal.

  • Browse Community
  • Create Post
  • Modlog
  • Favorite/Unfavorite Community
  • Add community to group (not yet plumbed in)
  • Subscribe/Unsubscribe
  • Block / Unblock Community
  • View Community Details
  • View Community Moderators (click the mod username entries to bring up their profile modal + options)
  • Zoom in on the community icon

Misc Changes

  • Removed Fediseer badge option for posts (rarely used and Fediseer is accessible via Instance menu and from instances page)

    • I'm assuming rarely used. I don't (and won't) have any kind of telemetry, but from the instances I have seen running Tesseract in the wild, none have had those badges enabled.
  • Removed the "Community" menu from posts; all of those options are now available in the Community Profile modal (access by clicking the community name in the post heading)

    • Also allows accessing these options from comments (such as on profile pages) which normally do not have the "Community" menus.
    • The option "More from {user} in {community} has been moved to the post action menu.
  • Removed "Block {user}" from post action menu; access it from the user profile modal by clickin the user's name in the post/comment header.

  • Changed the button layout in the User Profile modal.

    • "View User on Their Home Instance" button has been shrunk to just a "Home" icon and is in the same row as "Go to Profile"
    • Added a new, small button (also inline with "Go to Profile") that will open the profile in a new tab/window
    • Same as above, but for user modlog
    • Shrunk "Copy Lemmyverse Link" button to just a "Share" icon button, moved inline with "Search for Alts" button.
    • Added new button to copy the actor ID (rather than Lemmyverse link). It is the "Link" icon next to the Lemmyverse button
    • Block User button now fully reactive
  • Add dark/light theme switcher to sidebar footer (near logo/version and Lemmy/Matrix/Github buttons)

  • Removed background on image zoom toolbar

  • SettingEditArray component is now filterable and can accept a comma-delimited list of entries

  • De-cluttered main menu (top right).

    • Removed User Settings Button
    • Removed App Settings Button
    • Added "Settings" button to go to /settings, moved to old "User Settings" slot
    • Moved "Manage Accounts" out of profile submenu and into main menu
  • Added user profile settings to /settings in addition to the application settings

    • Still accessible from Profile->Settings
  • Slight updates to admin panel

    • Changed layout of tagline editor
    • Taglines are now previewed as markdown (as they would be elsewhere)
    • Federation block/allow list configuration now uses the SettingEditArray component rather than being a discrete editor.

Get Tesseract

25
-1
submitted 7 months ago* (last edited 7 months ago) by [email protected] to c/[email protected]
 
 

Changelog for 1.4.x Series (Intrepid)

1.4.0

This is the first release which completely drops "legacy" support for 0.18.x and below. The minimum required API level is now 0.19.3 (though it will work with any 0.19.x series, there will be broken features that require 0.19.3).

None of the 0.19.4 features are implemented yet. Updating my instance to 0.19.4 is not on my priority list at the moment, though I really wished the media listing was present when I added the new media handling stuff. :sigh:

I'll probably be working on the 0.19.4 features sometime soon as I would like to finish what I had in mind for the media handling, and 0.19.4 provides the missing piece.

Anyway, here's what's new and improved:

New Features

Zoomable ImagesMost images are now zoomable: post images, user/site/community avatars, images posted in comments, etc.

All the pan/zoom libraries I tried suuuuuuucked, so I ended up rolling my own from scratch. The pinch zoom isn't quite where I want it, but it's a start. If anyone wants to contribute some code for improving that, please let me know.

  • Support zoom, pan, and rotate
    • Mouse scroll to zoom
    • Click/grab to pan
    • Rotate via on-screen buttons
    • Double-click to quick zoom in/out by 2x
  • Gesture support
    • Pinch zoom in/out
    • Swipe up to zoom in
    • Swipe down to zoom out
    • Swipe left or right to close the zoom modal
    • Other gestures may be added once I figure out a clean way to differentiate them from conflicting mouse events

Basic Gesture SupportFirst, I should point out that I am not a fan of gesture navigation; absolutely hate it as a primary method of interaction. I'm old and hate having to guess whether my fingers need to do the Macarena or the Hokey-Pokey to perform what should be an intuitive action.

That said, I do like waving things (and people) away.

To that end, I've added some gesture recognition in a few places, mostly modals. Any modal can now be dismissed with a left or right swipe in an area not bound by other event handlers.

  • e.g. You can't swipe in the text field to dismiss an edit/report/ban/remove modal; you have to swipe outside of that.
  • Left/right swipe was chosen as to not interfere with scrolling so it could be used consistently across all modal types.

The only other place, currently, with gesture support is the image zoom modal (described above).

I may add some additional swipe actions where it's intuitive to do so. For now, I'm content with modals being easier to dismiss on mobile without having to reach up to the close button in the top corner.

User Profile ModalsClicking on usernames throughout the application will now load a modal with their user card and relevant action buttons. Old behavior was taking you to their profile directly.

Actions include:

  • Go to profile
  • Message in Lemmy / Matrix
  • Block User
  • Search for alts / simiarly-named accounts
  • Ban user from instance (admins only)
  • View user on their home instance
  • Copy Lemmyverse link for user

Image Management on Posts/Comments

  • Images can be pasted in the post's URL field as well as in the markdown editor.
  • Images can optionally be pre-processed to webP along with a user-selectable quality level. Especially useful if your instance limits the size of uploads
  • Can delete post images (only before you save the post; unfortunately there's no way to retrieve the delete token after that even though it is stored in the DB. Yet another API limitation :sigh:)
    • This is addressed in 0.19.4, but I don't have support for that yet.
  • Images pasted/uploaded into the markdown editor are tracked in a bar along the bottom of the editor. Individual images can be deleted as needed along with the corresponding markdown code for them.

Hide Posts/Comments From New UsersIn App Settings -> Filters, you can now opt to hide posts/comments made by new users. You can also set the number of days an account is considered new: 1 to 30 days. That setting also is applied to the new user badges (if you set the minimum age to 15 days, any account 15 days or younger will show the new user badge).

This setting behaves differently for mods and admins:

  • Mods: Filter will be applied to all posts/comments except in communities of which you are a moderator.
  • Admins: Filter will be applied to all posts/coments except those made to communities local to your instance or those made to remote communities of which you are a moderator.

Comments made by new users will be hidden, and that includes any replies (essentially behaves the same way as blocked users)

Federation State ViewerFrom the instances menu on a post, there's a new option called "Federation Stats" which will show you the stats from your instance to the target and from the target to your instance. Also included in that is an estimated cacluation of the number of activities each instance is behind (useful for troubleshooting federation delays).

This information has also been added to the instance items at /instances

Please note that the "Activities behind" counter is only an estimate. The value for newest_activity_id is not provided by the API (because that would be useful, so why would the Lemmy devs include it?), so it has to be estimated. The estimation is done by looking at the last_successful_id of all the linked instances and grabbing the highest number and subtracting the last_successful_id for the selected instance. Not all of those activities would necessarily be coming to your instance (votes/posts/comments to communities yours isn't subscribed to, etc), so it is merely an estimation. Just because it shows you are behind by X number doesn't necessarily mean it's behind by that many.

Instances PageRe-wrote this to do manual pagination, searching, and filtering. Much more responsive now that it is not rendering several thousand components each with actions items.

"Click to Play" Media EmbedsIf media is disabled in the feed, the thumbnail will now have an overlay button that will convert it to an embed on-the-fly.

When loading a video via click-to-play, I'm conditionally setting the "autoplay" flag where the embed API supports it, but it doesn't always seem to be honored. This is an attempt to not have to press "play" twice for a video. So far, the only video frontend that seems to honor it is YouTube. Invidious/Piped, so far, do not, and neither does PeerTube.

Ok, so autoplay works if muted (no idea how YouTube's player gets around this; probably some chicanery). I think that's worse because you still have to click twice on the videos, and the "unmute" button is harder to reach than "play". So I think I'm going to just settle on having to click play twice.

This seems to be be a Chrome/Chromium thing (and explains why YT gets to bypass this). In Firefox, the autoplay flag is respected without having to mute the video.

Re-Integrated Piped Support as an Embeddable Youtube FrontendNow that click to play has been added, Piped support has been added back. It was removed due to poor performance and rate limiting when used with feed embeds.

If media embeds are enabed in the feed, only YouTube frontend will show direct embeds. Piped/Invidious will always be click to play regardless of embed setting due to above mentioned rate limiting / performance.

Alternate Source Dropdown / Archive LinksRemoved the [Archive Link] next to the post URL and replacd it with a fancy menu to the left of it.

  • On posts with links, it currently has buttons to search for the article at Archive Today, Ghost Archive, and 12ft.io
  • On Youtube-like posts, can select alternalte links for YouTube, Invidious, or Piped
    • Invidious/Piped will open with your preferred instance (defined in settings)
    • Useful if someone posts a video to an Invidious instance that performs poorly for you and you would prefer to view it on your preferred Invidious/Piped instance or canonically on YouTube.

Quick Action MenusOn mobile, the navbar was getting cluttered, so most of the discrete dropdowns there have been moved into Quick Actions menus.

  • Main, Community, and User feed pages: Quick Actions has replaced all discrete menus
  • Search Page, Modlog, instances page, and Community Browser: All of the filtering options are in a quick action menu

Users Can Now Add Their Own Preferred Invidious/Piped InstancesPrior to this release, any Piped or Invidious instances needed to be added by the administrator via environment variables. In addition to that, users can now add any number of custom Invidious and/or Piped instances in the app settings.

These will be combined with the built-in list and the admin-extended list and be available for use as your preferred YT frontend and for detection of Piped/Invidious links in posts.

Be aware that those custom instances will only render as embeds for you; they will be thumbnails for anyone else who hasn't added them to Tesseract. If you feel that instance should be added to Tesseract's built-in list, please submit a Github issue with the details.

Tesseract is pre-populated with the official list of public instances for each, but it can get out of date easily.

Note: As of 6/20/2024, I've noticed a lot of Invidious/Piped instances are now requiring login, and embeds through them no longer work. I believe if you have an account with one, log in, and enable 3rd party cookies for that domain, the embeds should work. I have not tried that, but it does work with Spotify. This isn't a Tesseract bug, unfortunately, or I'd fix it.

Can Disable Infinite Scroll if you WantIf you're not a fan of the infinite scroll, you can go to App Settings -> Feed and disable infinite scroll.

TOTP 2FA SetupCan now enable and enroll in 2FA as well as disable it.

Account Icons Now Use Your Profile AvatarIcons in the account switcher and account screens now sync to your profile avatar, if defined.

New Placeholder User AvatarsInstead of the initials as used previously on accounts without avatars, now uses Dicebear Adventurer pseudorandom avatars. Initials are still used for placeholder community icons when the community mods haven't set one.

Passwords Can Now Be RevealedAll password elements will now allow you to toggle them to reveal. Should make a big improvement when logging-in on mobile.

Vote Viewer (Admins Only)Admins can now see votes like in Lemmy-UI. Uses infinite scroll and deduplication to compensate for the stupid API that returns multiple/duplicate votes on each page.


Bugfixes and Enhancements

Removed 0.18.x Backwards Compatibility

  • Or, more specifically, removed 0.18.x JS client and the extensions I wrote to make that compatible with 0.19.x. Now uses the 0.19.3 JS client.
  • Removed the image upload proxy which was needed in 0.18x due to CORS restrictions.

Various Enhancements to Auth Module.

  • Added safety check so that the auth token is only ever sent to the profile's associated instance and cannot accidentally send to non-home instance (e.g. when browsing communities on a remote instance).
  • Fixed a few chicken/egg situations where the profile store needed to be accessed before it was initialized
  • If your auth token is invalid, such as after changing your password on another device, you will get a toast message you can click to take you to the login screen.
  • If a profile exists for a username/instance combo, logging in will update the auth token for that existing profile rather than creating a new one.
  • User avatars are now fetched when logging in.

Grace Period Before Media Embeds are Destroyed When Scrolling out of Viewport

  • Embeds now have a short timeout when leaving the viewport before they're removed from the DOM and turn back into thumbnails. Fixes annoyance when resizing the window while a video is playing and the video temporarily leaves the viewport and is destroyed. Timeout is 2 seconds and will reset/disarm if the post returns to the viewport before it expires.

Community Creation / Editing

  • Uses new upload handler for banner/icon
  • Can pre-process the banner/icon to webP before uploading
  • Shows a live preview of how the community card will look

General

  • Slightly darkened background color in light mode cards (bg-white->bg-slate-100) for better contrast. Did similarly for some button colors
  • Added "OpenDyslexic" as a UI font option
  • Can now close modals with Escape key, close button, or by swiping left/right
  • Added button to reveal password fields
  • Some modals can be closed by clicking out of them.
    • I need to disable this or make it more consistent. Some workflows utilize nested modals, so I do need to be able to keep them open when interacting with a child modal.
  • Added "share" link for searches.
    • Will generate a URL with the current search params and copy to your clipboard.

Other Stuff

Peertube Follows

On my last release post, someone mentioned that following Peertube channels may be broken. At the time I was still on 0.18.5 and had followed a PT channel, and seemed to be getting updates from it. Then I wasn't sure.

I can say that I have been getting at least some updates to the PT channel I follow (mostly as a test). While there have been videos posted there that did not come through to Lemmy, I don't know enough about PeerTube to know if they were published differently or what. However, I have gotten at least 2-3 that someone posted to Lemmy that would absolutely had to have come in via Federation.

Also confirmed that commenting on a PT video (from the channel feed, not an embed to a Lemmy community) does federate out and show up on Peertube's side along with any votes you give in Lemmy.

This isn't really a Tesseract issue since the Lemmy backend handles that. Just figured since I do support Peertube, it would be worth mentioning that it seems to work.

What Didn't Make the Cut This Release

  • User profile import/export
  • Link previews
  • Custom feed rewrite
  • Custom emoji management
  • Fediseer Rewrite

I keep kicking the can on the custom feed and infinite scroll re-writes, but for a good reason. I want to start using IndexedDB to get around storage constraints in the browser's LocalStorage API. I need to write and integrate a library for this (or find one I don't hate), and that's going to take some dedicated development time. Switching to IndexDB is also a step in the direction I want to go towards providing offline support. So, at some point, there will be a release that only focuses on that. Not sure if it'll be in the 1.4.x series or later, but ultimately, that is where I want to go.

Get Tesseract

view more: next ›