Pandacap

Source code: https://github.com/IsaacSchemm/Pandacap/

Pandacap is a single-user artwork gallery and feed reader built on .NET, with ActivityPub, Bluesky, and Atom/RSS support, and integrations with DeviantArt, Fur Affinity, and Weasyl.

Features:

Some of the things Pandacap does not do:

Philosophy

Unlike traditional social media applications, Pandacap does not use a single chronological infinite-scroll timeline. Instead, it adopts an inbox paradigm, similar to existing feed readers and art sharing sites:

Posts are also grouped under headings with the name and icon of the user who posted them. (In the case of shared/boosted posts, this is the name of the user who shared the post, not of the post's original author.)

Pandacap also does not attempt to maintain a "whole known network" view or provide any sort of search (by hashtag, for example) that includes content from users other than the instance owner.

Deployment

View details

Pandacap is an ASP.NET Core application written in a mix of C# and F#. It's designed to be deployed to an Azure Web App, with its own Cosmos DB NoSQL database, blob storage account, and Key Vault. See the git README for more information.

Authentication for the instance owner is determined by an Entra app registration in Azure whose ID and secret are present as configuration values in the Pandcap web app. Any Microsoft account with the appropriate permissions on the Entra app registration will be able to log in as the instance owner (generally, you only want one such account). Pandacap's ASP.NET Identity user store is separate from its main Cosmos DB data store, and is kept in memory. (This means that upon restart, Pandacap will prompt you again for a username when you log in.)

Once logged in, you can use the ASP.NET Identity tools to attach a DeviantArt or Reddit account; you won't be able to use these accounts to log in (because the user store is ephemeral), but doing so will establish API tokens for those platforms and enable the corresponding integration.

Design

Public Content

The public-facing portion of Pandacap consists primarily of the home page, the following page, and the user's posts and favorites.

Pandacap has four kinds of user posts:

Favorites have a variety of sources: ActivityPub, Bluesky, or RSS/Atom posts can be added to Favorites, and DeviantArt, Fur Affinity, or Weasyl favorites are imported periodically if an attached account is found. Upvotes of top-level Reddit posts are also imported to the Favorites section.

Private Content

The remainder of Pandacap is accessible only to the instance owner, and includes the notifications section and the inbox, split into:

Inbox posts are stored in Pandacap's data store, while notifications are fetched on demand when you visit the Notifications page.

Platforms

Pandacap supports a variety of protocols and platforms.

Posts from other users (whether in the inbox or in Favorites) are shown with a color-coded badge indicating the site they originated from; for example, ActivityPub instances (including threads.net or bsky.brid.gy) are shown in hot pink, while Bluesky PDSes are shown in blue and RSS and Atom feeds are shown in light orange.

Atom / RSS

View details

Pandacap makes its Gallery and Text Posts pages available as Atom and RSS feeds, and allows the instance owner to follow Atom or RSS feeds, whose posts will show up in the appropriate section of the inbox.

Podcasts are sent to their own inbox area, where Pandacap will provide a pop-out media player with rudimentary Chromecast support and an audio output device switcher, among other features.

ActivityPub

View details

Pandacap implements ActivityPub S2S (server-to-server) and hosts a single actor, at the same root URL that hosts the home page (e.g. https://pandacap.example.com/).

Pandacap has two kinds of public posts: user posts and addressed posts. Addressed posts are ActivityPub-specific and are used for replies (and top-level Lemmy posts); they are always sent as Note but can have a separate title (name). There are four kinds of user posts: artwork and status updates (which are sent as Note), journal entries (which are sent as Article), and scraps (which are not federated over ActivityPub at all).

You can follow ActivityPub actors (including Flipboard or Threads accounts with ActivityPub turned on), and - for each actor - choose whether you want to:

Adding an ActivityPub post to your Favorites will show the post on your Favorites page (as with other platforms), but it is also equivalent to an ActivityPub Like. At this time, Pandacap does not support sending other activities such as Announce (boosting posts) or Dislike (downvotes).

Incoming ActivityPub interactions, as well as replies to your posts, appear in the Notifications section. Posts that mention you (whether from users you follow or not) appear in Notifications as well.

ATProto / Bluesky

View details

The current version Pandacap does not act as, or connect to, an atproto PDS. Instead, it uses a combination of methods to interact with the network directly without going through the Bluesky AppView:

Pandacap's only use of Bluesky infrastructure is its CDN, for showing thumbnails of posts on the public Favorites page.

When you add an atproto feed to Pandacap, you can choose whether you want to include:

You can also choose whether to:

DeviantArt

View details

Pandacap connects to the DeviantArt API. An OAuth connection can be established from the "Hello" link in the navbar, using ASP.NET Identity. (The account may not persist in the External Logins list, but Pandacap will store the API credentials in its data store.)

All four types of user posts can be crossposted to DeviantArt using a "Post to DeviantArt" on the post's page.

Pandacap will populate the inbox with artwork from users you watch on DeviantArt (using the API-provided feed), and with their journal entries and status updates (by querying each user's profile, although users who have not logged in since the last refresh will be skipped). It will also populate the notifications section with your DeviantArt messages and notes, and import your new DeviantArt favorites to its Favorites section.

Fur Affinity

View details

Pandacap connects to Fur Affinity through a combination of scraping / form simulation and FAExport, using browser cookies that you paste into a Pandacap configuation page.

Artwork posts can be crossposted to Fur Affinity as submissions.

Pandacap will populate the inbox and notifications pages with artwork, posts, and notifications from Fur Affinity's notifications area. It will also import your new Fur Affinity favorites to its Favorites section (although only posts that appear on sfw.furaffinity.net will be included, regardless of your own content settings).

Reddit

View details

When connected to a Reddit account, Pandacap will import upvotes of top-level posts into the Favorites section. No integration with the inbox or notification sections is included, however.

Weasyl

View details

Pandacap uses Weasyl API keys and a combination of API endpoints and scraping / form simulation.

Artwork posts can be crossposted to Weasyl as visual submissions.

Pandacap will populate the inbox and notifications pages with artwork, posts, and notifications from Weasyl's notifications area. It will also import submissions you add to your Weasyl favorites into its own Favorites section, as long as they have a "general" rating. (Importing characters or other submission types into Favorites is not supported.)

Pandacap uses a PHP proxy for all Weasyl requests, since Weasyl's IP address filters do not always allow requests from Azure data centers.

Screenshots

Public

View screenshots

The Pandacap home page,
              with links to ActivityPub and Bluesky handles and sections
              for Newest Artwork, Favorites, and Recent Text Posts
Home page

A set of 20 thumbnails, with RSS and Atom links and a
              'show more' button
Public artwork gallery

A list of status updates and
              journal entries by title, with links to view full posts,
              and a next page button
Public status updates and journal entries

A list of followed users
              and feeds on Bluesky, ActivityPub, and RSS, with forms to
              add new AP, Bluesky, Threads, or RSS feeds
List of followed users and feeds
(sites for which Pandacap imports an extenal feed - i.e. DeviantArt - are not included)

A list of 20 thumbnails,
              with usernames and hostnames, color-coded by protocol
Favorite image posts - both native (ActivityPub, Bluesky, RSS) and imported

A list of 20 short
              status updates from other users, with usernames and
              hostnames
Favorite text posts (including podcasts)

Authenticated

View screenshots

A list of users/feeds with
              usernames and hostnames, along with option buttons for
              each, and form fields to add new ones
Feed management / add new feeds

Lists of thumbnails,
                grouped by user (with avatar and username in a heading),
                with checkboxes to remove each
"Image posts" section of the inbox
(note the "select all" and "remove selected items" buttons at the bottom of the page)

Lists of linked post titles, grouped by user (with
                avatar and username in a heading), with checkboxes to
                remove each
"Text posts" section of the inbox

Lists of both post titles and thumbnails, sorted by
                user and by post type
"Shares" section of the inbox

Lists of podcasts, grouped by feed, with
                "launch player" buttons for each episode
"Podcasts" section of the inbox

A list of notifications from ActivityPub, Bluesky,
                and other platforms, grouped by date
Notifications page

An ActivityPub
                post, with user name/icon, addressing, image, and text
Viewing an ActivityPub post
(logged-out users get redirected to the original server)

A Bluesky post, with
                user name and icon, image, and text
Viewing a Bluesky post
(logged-out users get redirected to bsky.app)