Blacksky AppView

2026-03-0821:4014595github.com

Blacksky fork of bluesky-social/atproto with AppView performance optimizations, caching, and community features - blacksky-algorithms/atproto

This is Blacksky's fork of the AT Protocol reference implementation by Bluesky Social PBC. It powers the AppView at api.blacksky.community.

We're publishing this for transparency and so other communities can benefit from the work. This repository is not accepting contributions, issues, or PRs. If you want the canonical atproto implementation, use bluesky-social/atproto.

All changes are in packages/bsky (appview logic), services/bsky (runtime config), and one custom migration. Everything else is upstream.

The upstream dataplane includes a TypeScript firehose consumer (subscription.ts) that indexes events directly. We replaced it with rsky-wintermute, a Rust indexer, for several reasons:

  • Performance at scale: The TypeScript consumer processes events sequentially. At network scale (~1,000 events/second, 18.5 billion total records), a full backfill at ~90 records/sec would take 6.5 years. Wintermute targets 10,000+ records/sec with parallel queue processing.
  • Backfill architecture: Wintermute separates live indexing from backfill into independent queues (firehose_live, firehose_backfill, repo_backfill, labels). Live events are never blocked by backfill work.
  • Operational tooling: Wintermute includes utilities for direct indexing of specific accounts, PLC directory bulk import, label stream replay, blob reference repair, and queue management -- all needed when bootstrapping an AppView from scratch.

The dataplane and appview from this repo still run as-is. They read from the PostgreSQL database that wintermute writes to. We just don't start the built-in firehose subscription.

These are broadly useful to anyone self-hosting an AppView at scale.

LATERAL JOIN query optimization (packages/bsky/src/data-plane/server/routes/feeds.ts)

  • getTimeline and getListFeed rewritten with PostgreSQL LATERAL JOINs to force per-user index usage instead of full table scans. Major improvement for users following thousands of accounts.

Redis caching layer (packages/bsky/src/data-plane/server/cache/)

  • Actor profiles (60s TTL), records (5m), interaction counts (30s), post metadata (5m)
  • Reduces database load under production traffic
  • Known issue: The actor cache has a protobuf timestamp serialization bug where Timestamp objects lose their .toDate() method after JSON round-tripping through Redis, causing incomplete profile hydration on cache hits. We currently run with Redis caching disabled. The fix is to serialize timestamps as ISO strings on cache write and reconstruct on read.

Notification preferences server-side enforcement (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)

  • When the client doesn't specify reasons, the server applies the user's saved notification preferences. Without this, preferences are only enforced client-side and have no effect.

Auth verifier stale signing key fix (packages/bsky/src/auth-verifier.ts)

  • On JWT verification retry (forceRefresh), bypasses the dataplane's in-memory identity cache and resolves the DID document directly from PLC directory. Fixes authentication failures after account migration where the signing key rotates but the cache holds the old key.

JSON sanitization (packages/bsky/src/data-plane/server/routes/records.ts)

  • Strips null bytes (\u0000) and control characters from stored records before JSON parsing. These are valid per RFC 8259 but rejected by Node.js JSON.parse(), causing silent rowToRecord parse failures in the dataplane that surface as missing posts.

Infrastructure for private community posts that live on the AppView rather than individual PDSes. Specific to how Blacksky works, but could serve as a reference for other communities.

  • Custom lexicon namespace community.blacksky.feed.* with endpoints for submit, get, delete, timeline, and thread views
  • Separate community_post table (migration: 20260202T120000000Z-add-community-post.ts)
  • Membership gating at the dataplane and API layer
  • Integration with getPostThreadV2 for mixed standard/community post threads
  • Requires a separate membership database (BLACKSKY_MEMBERSHIP_DB_URL)
Bluesky Relay (bsky.network)
     |
     v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
  (Rust indexer)            |                (Go search)
  - firehose consumer       |                     |
  - backfiller              |                     v
  - label indexer           |               OpenSearch
  - direct indexer          |
                            v
                    bsky-dataplane (gRPC :2585) <--- Redis (optional)
                            |
                            v
                    bsky-appview (HTTP :2584)
                            |
                            v
                    Reverse proxy (Caddy/nginx)
Component Source Purpose
rsky-wintermute blacksky-algorithms/rsky Rust firehose indexer: consumes events, backfills repos, indexes records into PostgreSQL
rsky-relay blacksky-algorithms/rsky AT Protocol relay for receiving moderation labels from labeler services
rsky-video blacksky-algorithms/rsky Video upload service: transcodes via Bunny Stream CDN, uploads blob refs to user PDSes
bsky-dataplane This repo (services/bsky) gRPC data layer over PostgreSQL
bsky-appview This repo (services/bsky) HTTP API server for app.bsky.* XRPC endpoints
Palomar blacksky-algorithms/indigo Full-text search: indexes profiles and posts into OpenSearch with follower count boosting
palomar-sync blacksky-algorithms/rsky Syncs follower counts and PageRank scores from PostgreSQL to OpenSearch

Wintermute is a monolithic Rust service with four parallel processing paths:

  • Ingester: Connects to bsky.network firehose via WebSocket, writes events to Fjall (embedded key-value store) queues
  • Indexer: Reads from queues, parses records, writes to PostgreSQL with ON CONFLICT for idempotency
  • Backfiller: Fetches full repo CAR files from PDSes, unpacks records into the backfill queue
  • Label indexer: Subscribes to labeler WebSocket streams, processes label create/negate events

Additional CLI tools included in the rsky repo:

  • queue_backfill -- queue DIDs for backfill from CSV, PDS discovery, or direct DID lists
  • direct_index -- fetch and index specific repos bypassing queues (useful for fixing individual accounts)
  • label_sync -- replay label streams from cursor 0 to catch up on missed negations
  • plc_import -- bulk import handle/DID mappings from PLC directory
  • palomar-sync -- sync follower counts and PageRank to OpenSearch

Video upload service for users whose PDS doesn't support Bluesky's video.bsky.app. Uses its own DID (did:web:video.blacksky.community) to authenticate to user PDSes via service auth JWTs. Flow:

  1. Client gets service auth token from PDS (audience: video service DID)
  2. Client uploads video bytes to rsky-video
  3. rsky-video generates a CID, uploads the blob to the user's PDS
  4. Video forwarded to Bunny Stream CDN for transcoding
  5. On completion, client creates the post referencing the blob -- PDS validates the blob exists

Moderation labels come from labeler services (e.g., Bluesky's Ozone) via WebSocket subscription. Wintermute's ingester processes labels in a dedicated label_live queue (low volume, separate from the main firehose). The label_sync tool can replay a labeler's full stream to catch up on missed negations (label removals) without reinserting labels.

  • Node.js 18+ and pnpm (for building the dataplane and appview)
  • PostgreSQL 17 with the bsky schema
  • Redis (optional, for caching -- see known issue above)
  • rsky-wintermute consuming the firehose and populating the database
  • OpenSearch (if running Palomar search)

The bsky schema is created by the dataplane's migrations. On first run, the dataplane will apply all migrations automatically. The only Blacksky-specific migration is 20260202T120000000Z-add-community-post.ts (community posts table). If you don't need community posts, you can remove it.

rsky-wintermute writes to this same schema. All its INSERT statements use ON CONFLICT so it's safe to run wintermute and the dataplane migrations in any order.

node services/bsky/dataplane.js
Variable Required Description
DB_PRIMARY_URL Yes PostgreSQL connection string with ?options=-csearch_path%3Dbsky
DB_REPLICA_URL No Read replica connection string
BSKY_DATAPLANE_PORT No gRPC port (default 2585)
BSKY_REDIS_HOST No Redis host:port for caching (currently recommended to leave disabled)
BLACKSKY_MEMBERSHIP_DB_URL No Separate DB for community membership (Blacksky-specific)
node services/bsky/api.js
Variable Required Description
BSKY_APPVIEW_PORT No HTTP port (default 2584)
BSKY_DATAPLANE_URLS Yes Comma-separated dataplane gRPC URLs
BSKY_DID Yes The AppView's DID (e.g. did:web:api.example.com)
BSKY_MOD_SERVICE_DID Yes Ozone moderation service DID
BSKY_ADMIN_PASSWORDS Yes Comma-separated admin passwords for basic auth

A full-network backfill (all ~42M users, ~18.5B records) takes weeks even with wintermute's parallel processing. Expect:

  • Live indexing: Keeps up in real-time from day one (~1,000 events/sec)
  • Full backfill: 2-4 weeks at 10,000 records/sec depending on PDS responsiveness and network conditions
  • Partial backfill: Hours to days for a subset of users (e.g., community members only)

During backfill, the AppView is functional but will show incomplete data for users that haven't been backfilled yet. Live events are indexed immediately regardless of backfill progress.

These are issues we encountered bootstrapping a full-network AppView. If you're doing the same, you'll likely hit some of these:

COPY text format JSON corruption: PostgreSQL's COPY text protocol treats backslash as an escape character. If your bulk loader doesn't escape backslashes in JSON strings, \" becomes " and you get silently corrupted records. The record.json column is type text (not jsonb), so PostgreSQL won't catch this. We found ~66,000 corrupted records and had to repair them by re-fetching from the public API.

Null bytes in JSON: Some AT Protocol records contain \u0000 (null byte), which is valid JSON per RFC 8259 but rejected by Node.js JSON.parse(). The dataplane silently returns null for these records. Strip null bytes before writing to the database.

Timestamp format sensitivity: The dataplane expects timestamps with millisecond precision and Z suffix (2026-01-12T19:45:23.307Z). Nanosecond precision or timezone offset format (+00:00) causes subtle sorting and comparison issues.

Notification table bloat: Without a unique constraint on (did, recordUri, reason), the notification table grows unbounded with duplicates. Ours reached 1.3 billion rows (663 GB) before we caught it. Adding ON CONFLICT DO NOTHING to INSERTs only helps if the unique index exists first, and creating the index requires deduplication of the existing data.

Post embed tables: The post_embed_image and post_embed_video tables aren't populated by default if your indexer doesn't handle them. Without these, the media filter on getAuthorFeed returns nothing. These need to be backfilled separately.

Label negation ordering: Label negation (removal) events reference the original label by source, URI, and value. If negations arrive before the original label (common during backfill), they're silently dropped. The label_sync tool replays the full stream to catch these.

Fjall queue poisoning: The Fjall embedded database (used for wintermute's queues) can enter a "poisoned" state after crashes, blocking all queue operations. The fix is to delete the queue database directory and restart -- wintermute will catch up from the relay's cursor (relays keep ~72 hours of history).

TLS provider initialization: Rust's rustls requires explicitly installing a crypto provider before any TLS connection. Without rustls::crypto::aws_lc_rs::default_provider().install_default() at startup, the first WebSocket connection to the firehose panics.

Signing key rotation after account migration: When users migrate between PDSes, their signing key changes. The dataplane caches identity data with a staleTTL of 1 hour. During that window, JWT verification fails for migrated users. The fix is to bypass the cache on verification retry and resolve directly from PLC directory.

Based on running a full-network AppView (all ~42M users, ~18.5B records).

Resource Minimum Recommended
CPU 16 cores 48+ cores
RAM 64 GB 256 GB
Storage 10 TB NVMe 28+ TB NVMe (RAID)
PostgreSQL Dedicated, same machine or low-latency Same machine recommended
Network Sustained 100 Mbps 1 Gbps+

Storage breakdown (approximate, full network):

Table group Size
Posts + records ~3.5 TB
Likes ~2 TB
Follows ~500 GB
Notifications ~600 GB
Indexes ~4 TB
OpenSearch (Palomar) ~500 GB

For a smaller community running a partial AppView (indexing only community members), requirements scale roughly linearly with indexed accounts.

git remote add upstream https://github.com/bluesky-social/atproto.git
git fetch upstream
git merge upstream/main

Conflicts will typically be in packages/bsky/src/data-plane/server/routes/ and packages/bsky/src/api/. Resolve by keeping our additions alongside upstream changes.

Same as upstream: dual-licensed under MIT and Apache 2.0. See LICENSE-MIT.txt and LICENSE-APACHE.txt.


Read the original article

Comments

  • By pjc50 2026-03-0822:513 reply

    Some more background and a user report of the migration process: https://gregpak.net/2025/11/13/how-and-why-i-moved-from-a-bl...

    Crucially, the purpose of Blacksky is to provide a service for the (US) black community which has its own moderation decisions while being substantially interoperable.

    (Remember, the reasons people use one social network rather than another are almost always social first and technical second, where the social functions are enabled or hindered by the technology)

    • By illithid0 2026-03-0823:502 reply

      That post isn't very clear about what specifically happened on BlueSky that made the author move, and I can't see the full thread he links without having a BlackSky account.

      What moderation decisions were made regarding this "Link" user that were suspect, using the post author's word?

      • By knowtheory 2026-03-092:41

        There are a lot of misunderstandings about what Blacksky is assuming that it's a just a community fork of Bluesky.

        The Blacksky team has a much broader vision for which they decided ATProto was the right architecture.

        There's a lot more to read about them up on their site: https://blackskyweb.xyz/

      • By seltzered_ 2026-03-092:05

        My perspective of that situation is Link was a fairly popular poster, and had a post that was a quote post of someone from the Bluesky team with an image of an assassinated figure and an alt text that couldve been perceived as a threat to the bluesky team.

        Some commentary ( https://bsky.app/profile/mackuba.eu/post/3m2jtzlznu22o ).

        IIRC it came during a week of discourse & tensions around bluesky moderation concerning some controversial writers ( https://bsky.app/profile/jay.bsky.team/post/3m25esnq4t22y )

        I share this just to be helpful a tiny bit but theres likely a lot of context missing and different perspectives on this.

    • By slopinthebag 2026-03-0823:311 reply

      > Crucially, the purpose of Blacksky is to provide a service for the (US) black community which has its own moderation decisions while being substantially interoperable.

      What are the differences between Bluesky and Blacksky? What does it mean to provide different services for the black community?

        • By slopinthebag 2026-03-090:162 reply

          > The main Blacksky feed and platform are exclusively for Black people. Non-Black people cannot create accounts to post on Blacksky.

          Fascinating

          edit: before people take it the wrong way, I mean it's fascinating in that I've never seen these type of moderation policies before. I've seen plenty of communities about cultures (i.e. Ukrainian discord servers), but not around Race and not exclusionary to outsiders. I'm not making a moral judgement here.

          • By OneDeuxTriSeiGo 2026-03-090:261 reply

            Yeah it's worth noting that blacksky provides accounts to non-black users but their posts don't get included in the blacksky feed. And non-blacksky PDS users who are confirmed black still are allowed to be included in the blacksky feed.

            So it's multiple components really.

            - The blacksky feed which is a curated feed and community built around the US black community on atproto.

            - The blacksky client, appview, moderation team, and relay which provide the necessary infrastructure for blacksky to operate independent of the rest of the ecosystem if they need to and for them to tailor their experience to their community.

            - The blacksky PDS which serves as a source of truth for data storage and auth for blacksky users that choose to use it.

            And of course non-black users can use all of this infrastructure but if you aren't black and you want to host your account on a blacksky PDS you have to pay a small subscription/donation.

            It's all for their community but they are more than willing to let other people use their infra as long as those people pay their fair share.

            • By arrowsmith 2026-03-090:393 reply

              Not that I’m going to do it myself, but what’s to stop a non-black person from signing up? Do you verify people’s identities?

              • By tptacek 2026-03-090:452 reply

                I assume it's mostly the same thing that keeps non-Catholics from taking communion at Catholic mass.

                • By knowtheory 2026-03-092:46

                  Yes, as far as i know it's an honest self-report kind of thing.

                • By julianlam 2026-03-091:281 reply

                  tasteless wafers?

                  • By tptacek 2026-03-0917:54

                    In the sense that there's no upside to violating the norm, yeah, that too.

              • By OneDeuxTriSeiGo 2026-03-091:041 reply

                Note that I'm not a blacksky member, just someone involved in the greater atproto space so my understanding of the process is likely not perfect.

                But AFAIK the way blacksky operates is that they assume good faith when new users join. If it becomes obvious that you are not black then you will likely get reported or directly hit by moderation action and they will ask you to verify your identity at some level.

                I think it's something along the lines of "send a photograph that would be non-trivial to fake". Not necessarily forcing you to dox yourself but requiring that you provide some level of evidence that's visibly resistant to AI/tampering. Now I have no idea the extent to which they do this to be entirely honest but I do know they don't mess around with people doing "digital blackface".

                I'm not sure how well that moderation approach will scale at large but given they are a community that has carved out their own niche and not a corp just blindly driving to scale, I doubt they'll see the strain that the greater bluesky and atproto have experienced with moderation struggles at scale. And given all decisions around policy and moderation rules are decided by the Blacksky People's Assembly, as the community evolves participants can participate in governance and help craft the process if they are dissatisfied.

                • By what 2026-03-093:112 reply

                  What does it mean to be “obviously not black” in a digital context?

                  • By OneDeuxTriSeiGo 2026-03-093:58

                    i.e. it becomes clear you are using it as a sockpuppet account (some users have been caught trying to do this), outright saying you aren't black, etc.

                    Like if you aren't being a niche internet celebrity and aren't trying to play main character on the internet it's unlikely you'd get caught unless you were particularly stupid but that's also kinda part of the point. It's a community and people in that community know each other both online and IRL. It'd be pretty hard to be involved in the community without leaving behind an evidence trail of you blatantly lying about who you are.

                  • By IncreasePosts 2026-03-093:281 reply

                    Go into the subreddit "blackpeopletwitter" and just open a bunch of threads and look for someone commenting "found the white guy", or something like that.

              • By erxam 2026-03-090:57

                I don't exactly know either, but it's probably some sort of lax verification measure like a selfie.

                Don't need extreme measures to keep bad actors out if you're able and willing to throw out anyone who obviously doesn't intend on playing nice.

    • By TacticalCoder 2026-03-0823:557 reply

      [flagged]

      • By pfraze 2026-03-090:061 reply

        Black people seeking structural or infrastructural autonomy within the US to counteract their historic exclusion from power, production, and protection post-slave-trade is a fairly specific context which doesn't apply to white or asian folks. Also I don't think asian people would appreciate being called "yellow."

        • By xg15 2026-03-090:484 reply

          I can understand it from their perspective, but still don't think it's a good development (same with other exclusionary "safe spaces" for other groups).

          Or rather, I'd at least like to know what is the end game here. Have those groups effectively given up any hope of changing the country and mainstream society at large, so the new strategy is now retreating into gated communities while leaving the rest to the Trumps and Musks?

          • By komali2 2026-03-091:272 reply

            > I'd at least like to know what is the end game here. Have those groups effectively given up any hope of changing the country and mainstream society at large, so the new strategy is now retreating into gated communities

            I noticed this occasional tendency in the west to analyze an action or behavior by hypothetically scaling it to way beyond the scope of the actual action or behavior, and I've been wondering if this is some kind of judicial application of Kantian thinking?

            I'd push back on that and say, not everything has to be scaled. Not every behavior is an indictment of other behavior. People doing things isn't necessarily an argument that all people should do those same things. Nor is it an indication that those people only want to do those things that way - just because some black people want a reprieve from whatever their perception of day to day western life is, doesn't mean they've "given up" on making any changes to that society.

            • By xg15 2026-03-091:432 reply

              It's part of a trend though. The tendency of "safe spaces" is several decades old by now.

              You can still ask why someone would think that this is a good or necessary thing to do.

              • By brendoelfrendo 2026-03-093:051 reply

                Is not the onus on the rest of society to examine why black people (or any marginalized group) would not feel safe without their own safe spaces?

                • By alienthrowaway 2026-03-097:32

                  It's facetious when people question why BlackSky need to exist 40+ years after the "14 words" and in the age where White Christian Nationalism is completely mask-off.

                  HN often tolerates dog whistles about how school kids bussed from "the had part of town" are a net-negative, but BlackSky is suddenly the bad type of segregation? GTFOH.

          • By Kye 2026-03-090:581 reply

            It's not gated. I can still talk to people fully in the Blacksky stack and interact with their public posts.

            The usual pattern is like that Alex Norris comic:

            "you do not fit in here"

            "okay we will make our own place"

            "why are you excluding us"

            "oh no"

            Except here they can stay connected with the broader Atmosphere but engage on their own terms.

            • By illithid0 2026-03-091:082 reply

              I might be missing something about the protocol, but when logged into BlueSky, I can't interact with BlackSky accounts at all. I specifically have to have an account there to even follow a BlackSky account.

              I'm not as familiar with ATProto as ActivityPub, but following someone from another Mastodon instance, for example, is seamless as long as I'm logged in to the account I have on my home instance.

              • By rubyn00bie 2026-03-094:55

                I follow, and am followed by, folks who use Blacksky and interact with them regularly. I have had zero issue with this, at any point. As Paul (the CTO of Bluesky) said in a sibling comment this would be a very serious bug.

                FWIW— I have also not heard anything even remotely close to this at all from anyone using either service.

              • By pfraze 2026-03-091:151 reply

                Can you describe what happens? That would be a pretty significant bug. Users are hosted all over the place and typically interact fine.

                • By illithid0 2026-03-0913:581 reply

                  I was trying to interact with the account mentioned in the grekpak blog post here: https://blacksky.community/profile/did:plc:w4xbfzo7kqfes5zb7...

                  I can't comment, follow, like, or anything like that without getting the "Sign in or create your account to join the cookout!" popup. I wasn't trying to cause problems or get downvoted, this is just the the first non-BlueSky PDS I've ever come across and was curious to see the federation work.

                  • By pfraze 2026-03-0914:581 reply

                    Oh just look them up on the app you have an account with (I believe bluesky). @rude1.blacksky.team

                    • By illithid0 2026-03-0915:53

                      Ah, okay, thank you. I was expecting it to work more like Mastodon in the sense that I can go to a different instance and interact with accounts seamlessly without having to bring them up in my own instance, but this is fine, too.

          • By pfraze 2026-03-090:57

            The way the protocol works, they're not isolated, and so they're not ceding ground to other groups. I suppose the closest analogy would be an email host, in that running your own email host wouldn't materially isolate your users but it would enable you to set policies for your own users.

          • By epistasis 2026-03-093:05

            What is an exclusionary safe space? I've never heard of or encountered such a thing. Or are you saying that safe spaces are necessarily exclusionary, because they are welcoming people that have reasons to feel unsafe other places?

            It seems like a very confusing concept to just throw out there without explanation!

      • By orsorna 2026-03-090:131 reply

        It's difficult to describe how the US black community has uniquely suffered for centuries due to unique appeal of the mercantile class to the Catholic church about how it's actually okay to mistreat their human cargo and perform chattel slavery. Then, hundreds of years later the mercantile reason is forgotten, yet bigotry from it lays embedded in American society. And in other societies that took black people as slaves, to a lesser extent.

        So a black segregated community does not sound very racist for these historical reasons. Not to say that desegregation in America has failed, but that there are infallible holdouts that wish to cling to a rotted out ideology that, again, its origins by its believers have largely forgotten.

        Asian American communities are complicit, more or less unknowingly, to a lesser extent but only because they have aped to authority in America to achieve "whiteness".

        The sad truth is that there is no community that prides itself on being white without parroting trickster mercantile talking points, of which again I remind that their origins are forgotten and they do not even know why they hate so fiercely.

        So something like Blacksky is genuinely exciting in theory. Even though it will probably self select in a way that makes it inhospitable for new comers. Much like Bluesky...but, I'm describing a separate argument from historical bigotry, which I feel compelled to call out since its origins have--for the fourth time--been so forgotten.

        • By komali2 2026-03-091:30

          I've never heard about this mercantile Catholic church thing, can you expand on it?

      • By minitech 2026-03-090:062 reply

        - “yellow” is a racist adjective for asians, “black” is not a racist adjective for black people

        - there is no “white community” in the US to make the equivalent to “black community”

        so you can’t really draw any useful conclusions from how string replacement on this sentence makes you feel

        • By amazingamazing 2026-03-090:253 reply

          > - “yellow” is a racist adjective for asians, “black” is not a racist adjective for black people

          the term black historically was used and originated in a racist manner.

          • By well_ackshually 2026-03-090:371 reply

            If and when the asian community decides to reappropriate "yellow" as a way of self identification, then given a few decades, it will not be seen as racist anymore.

            In the mean time, "yellow" is a racist adjective for asians, "black" is not a racist adjective for black people.

              • By mburns 2026-03-090:471 reply

                > In several Gallup measurements over the next three decades, including the most recent in 2019, the large majority of Black Americans have said the use of Black vs. African American doesn't matter to them.

                • By amazingamazing 2026-03-092:151 reply

                  Not caring is not acceptance. The term is literally racist both and origin. Unfortunately they were denied being called simply Americans due to historical reasons. African American is sadly also a misnomer given that there’s barely any connection to Africa for the people generally referred to as “black”.

                  Notice how everyone else is called by nationality or origin.

                  • By brendoelfrendo 2026-03-093:04

                    Black is absolutely accepted as an accepted adjective. Especially with the capital-b, Black is used to refer to the unique Black culture and heritage in the United States. Black history is one where people were taken from their nations or places of origin, transported to a foreign land, and put in bondage. As you say in your own comment, many black or African-American people (whichever label you prefer) have little connection to Africa; it wouldn't make sense to them to refer to them by nationality or origin, when Black culture is its own thing.

                    Don't get it twisted: I agree that the history of African-Americans in the US is one marred by slavery, segregation, racism, and the constant struggle to attain and retain equality. But out of that came something unique that many black people celebrate to this day.

          • By bbeonx 2026-03-090:381 reply

            this is true, "black" has been used in racist ways, but it got rehabbed and reclaimed in the 60s and 70s.

            but more to the point, it is not currently used in a racist manner by the vast majority of the US, and certainly does not carry the same connotations as "yellow", so not really comparable imo

          • By Angostura 2026-03-090:351 reply

            I suspect contemporary usage is most relevant here, no?

        • By packetlost 2026-03-091:14

          There's not really a black community either, it's a demographic. There are many communities of black people, but we really need to stop equating demographics with communities (not just this case).

      • By bbeonx 2026-03-090:331 reply

        "yellowsky" sounds racist because calling asians "yellow" is racist.

        "whitesky" sounds racist because...well, i don't know if you're a big history buff but in the US white-people-only gatherings were always suuuuper racist.

        • By what 2026-03-093:19

          Any X-people only gathering is super some-sort-of-ist.

      • By arrowsmith 2026-03-090:111 reply

        I don’t really care if some group that doesn’t include me wants to exercise their freedom of association — whatever, it’s a free internet, go do your thing — but my lord it’s amusing to see Bluesky keep purging itself via these endless purity spirals.

        Some people really can’t stand their own company.

        • By pfraze 2026-03-090:14

          I actually don't think Blacksky reflects any kind of cultural purging cycle. Blacksky is extremely practical in its formation & purpose - not reactionary to any specific events on the network - and most of the bluesky/blacksky userbases are connected and socializing. There's no beef between the userbases.

      • By erxam 2026-03-090:04

        [flagged]

  • By vvpan 2026-03-092:203 reply

    I'll post this as a top level comment, because I think it is crucial: A few people are saying that it is expensive to run a relay but others have done it for as low as $34/month [1]. So unless somebody presents other proof that it is expensive I would say that those posters are either wrong and trying to mislead us on purpose.

    Edit: actually the article links to somebody doing it for $18/month.

    [1] https://whtwnd.com/bnewbold.net/3lo7a2a4qxg2l

    • By whyrusleeping 2026-03-093:183 reply

      I've also done a full network replica (all the data indexed in a postgres) on a raspberry pi (with an 8tb nvme attached via a hat). Its really not expensive to do . And if I wanted to drop data older than say 3 months, it would be even cheaper still.

      • By vvpan 2026-03-093:471 reply

        Case in point! This is an often mentioned statement on which the argument that "atproto is no decentralized" largely hinges. There are honest atproto digs out there but that is not one.

        • By fc417fc802 2026-03-097:381 reply

          > There are honest atproto digs out there but that is not one.

          Which one? The expense, or not being decentralized? The latter remains valid because the majority of the userbase chooses ("only" by default ofc) to coordinate through a single operator. Network effects mean that you either play by their rules or you aren't allowed in the garden.

          It's good to learn that a full mirror is so cheap but I think the criticism still holds to the extent that it's a high enough price that unless something changes it will continue to discourage the network from ever becoming truly federated. Compare to activitypub where you can stand up a fully self sufficient node on more or less anything that's capable of networking. The obvious downside being that the network is more fragmented and often less reliable overall (ex nodes are regularly flaky or go missing entirely, no single unified view of the network, etc etc all the perfectly valid complaints about AP).

          I think AP, AT, and nostr all get certain things right but all have major downsides baked into their designs. Note that I don't mean this comment to be negative, merely to respond to your remark that the dig in question is somehow invalid.

      • By aorth 2026-03-093:451 reply

        How much was the 8TB NVMe?

        • By whyrusleeping 2026-03-094:12

          Cheaper than it is now! I think it was about $1100 at the time, definitely the most expensive part of the whole setup

    • By Zambyte 2026-03-1018:34

      > We run a full AppView + PDS + Relay for ~$1,772/mo. PDS is cheap (~$0.03/user/mo, 4 vCPUs, 32GB RAM). AppView is the expensive part; indexes the entire network (16TB DB), not just your users. Storage scales linearly with network activity. PDS scales linearly with your account count.

      Source, Rudy, the creator of Blacksky: https://bsky.app/profile/rude1.blacksky.team/post/3mgpvknv4i...

      The thing that makes ATproto nice and decentralized is that PDSs are decoupled from the application itself. Anyone can run a separate AppView, and just a handful of AppViews is enough to give people meaningful choice on ATproto, with the benefit of being much more approachable than ActivityPub for people who are not technically inclined.

    • By konart 2026-03-097:212 reply

      $18 can be "expensive".

      People live in different conditions, have different income and (even more crucial) different expenses.

      Not to mention subjective need. I may be interested in a relay, but I don't really need one. So for me 18$ will be too much. 5$? Maybe. (This is about as much as I'm paying for Fastmail right now, for example).

      • By croon 2026-03-0912:38

        The point isn't "literally everyone can run it", but to refute that "only Bluesky can run it and thus lock everyone in".

      • By sellmesoap 2026-03-0918:52

        I'll go halfers with you, any other takers? I feel like sharing infrastructure via small online co-ops can take the bite out of the cost. So much cheaper then the cost of being the product via meta/goog etc.

  • By ChrisArchitect 2026-03-091:56

    Some previous Blacksky discussion:

    Blacksky grew to millions of users without spending a dollar

    https://news.ycombinator.com/item?id=45018773

HackerNews