About

Pandacap is a personal art gallery and feed reader, built on ASP.NET Core and Azure.

Pandacap is a single-user application. Each Pandacap instance hosts:

  1. A public art gallery of the user's posts (split between image posts on one hand, and text posts - journals and status updates - on the other), imported manually from DeviantArt
  2. An unlisted, but public, set of ActivityPub replies and mentions created by the user from within Pandacap
  3. A private "inbox" of posts created or shared by users who the main user follows, accessible only to the main user after logging in (split between image posts, text posts, shares, and podcasts)

The instance owner logs in with their Microsoft account (access is gated through Entra, by applying limits to the app registration they create in the Azure portal during the deployment process - see the README in the source control repository for more detail).

Uploads

After logging in, the Pandacap user can upload images to Azure Storage. These public, unattached images are called uploads and are listed on the "view uploads" page that the logged-in user can access.

Posts

After logging in, the Pandacap user can create, crosspost, detach, or delete posts, including artwork posts, journal entries, or status updates:

All post types can have any number of tags, and images can have alt text. Posts with an image are created by creating an upload, then converting it into an attached image.

Posts with more than one image are supported by Pandacap's data model, but not by all crosspost targets, and there is currently no UI for creating such posts.

Posts in Pandacap are automatically shared via Atom / RSS and ActivityPub, but all crossposts (to DeviantArt, Bluesky, and Weasyl) must be initiated manually.

Connections

DeviantArt

Once the user logs in with their Microsoft account, they can attach their DeviantArt account from ASP.NET Core Identity's "external logins" page. This allows Pandacap to connect to DeviantArt and also allows the user to log in with their DeviantArt account (in lieu of their Microsoft account) in the future.

The user's DeviantArt follows are a source of posts for the Pandacap private inbox; these are populated periodically (on a timer).

Polling for journals and status updates is accomplished by checking the "last visited" timestamp of each user in the DeviantArt user's "friends" list, and checking profile posts by users who have visited DeviantArt since the last Pandacap inbox refresh.

Pandacap posts can also be individually crossposted to DeviantArt from the Pandacap "view post" page.

ActivityPub

Pandacap acts as an ActivityPub S2S server, hosting a single actor. This allows Mastodon and Pixelfed users to follow the Pandacap user and see image and text posts in their inbox.

Journal entries will be federated using the Article type; artwork posts and status updates will use Note.

It also allows the Pandacap user to follow ActivityPub actors; image posts, text posts, and shares from these users are added to the appropriate section of the Pandacap inbox.

Shares are disabled by default for followed ActivityPub actors, but can be enabled on an actor-by-actor basis. Shares will appear in the inbox under the name of the user who shared the post, not the original poster's name.

Note that Pandacap does not support the @user@domain syntax for actors that is used by most ActivityPub servers. Raw actor IDs (URLs) must be used directly.

In addition, Pandacap allows the logged-in user to create "addressed posts", either by posting to a Lemmy community, or by replying to another ActivityPub post. All such posts are text only (no title or attachments) and are public but unlisted.

Likes, shares, and replies from other users are shown on the Notifications page.

The Pandacap user can add ActivityPub posts to a public "Favorites" page, which is treated as a Like in ActivityPub.

Atom/RSS

The Pandacap user can add RSS and Atom feeds to their follow list. Pandacap will check each feed periodically, and new posts in these feeds will be added to the appropriate section of the Pandacap inbox.

Podcast feeds (where items have an enclosure of audio/mpeg) will appear with a "download" button that downloads the .mp3 file.

Pandacap also provides a "split" button, which splits the podcast episode into five-minute .wma chunks collected within a .zip file. This allows you to burn the chunks as individual tracks to a CD with gapless playback.

Bluesky

Pandacap implements a small atproto client. If the Pandacap user attaches a Bluesky account, posts from the account's home timeline (e.g. posts from users they follow) will be added to the Pandacap inbox.

Reposts are included in the Pandacap inbox in the "Shares" section, under the name of the sharing user.

Pandacap posts can also be individually crossposted to Bluesky / atproto from the Pandacap "view post" page.

Weasyl

If the Pandacap user attaches a Weasyl API key, new submissions from users they follow on Weasyl will be added to the Pandacap inbox.

Pandacap posts can also be individually crossposted to Weasyl from the Pandacap "view post" page.

Status updates will be created as journal entries.