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 Embeds

Links 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 Modals

By 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 Fetching

A 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 Support

LemmyVerse 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-ified

Links 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.