Pandacap: Part 4 - Inbox
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
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