isaacschemm: A cartoon of myself as a snail (snail8)
[personal profile] isaacschemm posting in [community profile] snailsharp

Pandacap: Part 4 - Inbox

Although it's not public-facing, the Inbox is perhaps the most useful part of the Pandacap web app. As a descendant of Artwork Inbox (Pandacap is built on EF Core + Cosmos DB in a very similar manner), the Pandacap inbox pulls in new posts from ActivityPub, Bluesky, DeviantArt, RSS/Atom, and Weasyl, and allows the logged-in user (me) to view and dismiss them, kind of like an email inbox.

Posts from users and feeds you follow are split between four different inboxes:

  • Image posts: DeviantArt and Weasyl art submissions, and any ActivityPub, Bluesky, and RSS/Atom posts that have an image attached. (Unlike the Pandacap gallery, these aren't called "artwork" posts, because Pandacap can't tell whether an image post is "art" or not.)
  • Text posts: DeviantArt journal entries and status updates, and any ActivityPub, Bluesky, and RSS/Atom posts that don't have an image.
  • Shares: If an ActivityPub and Bluesky post is showing up in your feed because it was shared / reposted / boosted by the user you follow, it will be sent here, instead of to the image post or text post sections. Pandacap will group shared posts by the user who shared them, not by the user who originally posted them.
  • Podcasts: RSS/Atom feeds that have an attached audio file will be sent here.

The user experience here is heavily inspired by the Fur Affinity and Weasyl inboxes: posts are shown roughly in chronological order; image posts have thumbnails and text posts only have a title; you have to click through to see the description / body of the post; checkboxes are used to remove posts from your inbox; and a "next page" button is used instead of a dynamic loading of new content.

An inbox page is built by taking 100 inbox items (most recent first) that match the criteria of that specific inbox, then grouping by a combination of the originating user (e.g. a DeviantArt or Bluesky account) and whether the post contains an image or not. Each post is then given a link (the title for image posts, the timestamp for text posts) to view it in a new tab, and a checkbox that can be used to remove it from the inbox. At the bottom of the page is the "remove selected items from inbox" button (as well as a "select / deselect all" button) and a link to the next page, if any.


Note that a few of these "image posts" don't have thumbnails - in this case, it's because the post was marked "mature", and Pandacap does not show thumbnails for these posts.

Another difference between how posts are presented in Pandacap, and how Bluesky or Mastodon might show them, is that there's a limit on how much of the post body is shown - this is especially relevant for microblogging. Clicking on the timestamp link will open the post itself in a new tab.


The "Shares" section mixes both image and text posts:


On the backend, inbox posts are split across six (!) data types:

  • InboxArtworkDeviations: populated by InboxIngest from the "deviants you watch" DeviantArt API call.
  • InboxTextDeviations: populated by InboxIngest from the "get friends" and "get profile posts" DeviantArt API calls. (Pandcap records the "last visited" date of each user you watch, and doesn't check their profile for new journals or status updates until it's changed.)
  • InboxWeasylSubmissions: populated by InboxIngest from the "list submissions" method of the Weasyl API.
  • RssFeedItems: populated by InboxIngest by fetching each subscribed RSS or Atom feed.
  • InboxATProtoPosts: populated by InboxIngest from the user's Bluesky timeline.
  • InboxActivityStreamsPosts: populated when the application recieves an appropriate Create or Announce activity from an ActivityPub user that the Pandacap user follows. (Update and Delete activities can also affect these items.)

InboxIngest is a scheduled fuction in the Functions app that runs every three hours. In many cases, Pandacap avoids adding a post to the inbox more than once by remembering "deleted" inbox items for a certain amount of time (such as one week), and timebounding its API lookups to a smaller window of time (such as three days). The "text deviations" and "RSS feed items", though, have mechanisms for keeping track of when they've last run.

In addition to the inbox, there's also a Notifications page:


This page collects:

  • Incoming ActivityPub activities that show someone liking, boosting (etc.) one of your posts
  • ActivityPub replies (when logged in, you can also see and reply to these on the post's page)
  • Messages from your DeviantArt messages feed
  • DeviantArt notes
  • A count of Weasyl notifications (for non-artwork posts) with a link to Weasyl for more information

Snail#

A programming blog where the gimmick is that I pretend to be a snail.

Expand Cut Tags

No cut tags

Style Credit

Page generated Jun. 4th, 2025 11:30 am
Powered by Dreamwidth Studios