Files
README.md

Rinds #

A collection of feeds under one roof. including Fresh Feeds

Running #

Install go, setup postgres, and then generate the required feed definitions under your user account. You can use https://pdsls.dev to generate a app.bsky.feed.generator record. Set the rkey to the desired short url value. Itll look like:

https://bsky.app/profile/{you}/feed/{rkey}

for the contents you can use the example below

{
  "did": "did:web:${your service endpoint}",
  "$type": "app.bsky.feed.generator",
  "createdAt": "2025-01-21T11:33:02.396Z",
  "description": "wowww very descriptive",
  "displayName": "Cool Feed Name",
}

If you are specifically trying to run any of the preexisting feeds, make sure to use the rkey as defined in the /pkg/feeds/*/feed.go and main.go files

Env #

You can check out .env.example for an example The port is for your feedgen serve, not your postgres port

Pinned Posts #

You can pin one post to the top of the first page of every fresh feed (rinds, random, reposts, mnine, oreplies, and their -replies variants) using these optional env vars:

PINNED_POST_URI=at://did:plc:xxx/app.bsky.feed.post/abc
PINNED_POST_START=2026-08-10T12:00:00Z   # optional: hide until this time
PINNED_POST_END=2026-08-11T12:00:00Z     # optional: hide after this time

The pinned post renders with a pin reason (app.bsky.feed.defs#skeletonReasonPin) and is only injected on the first page. If the pinned post already appears in the feed it is deduped so it only shows once. Env vars are read at startup, so changing the announcement requires a feedgen restart.

Postgres #

Be sure to set up .env correctly

All relevant tables should be created automatically when needed.

Index #

You should start Postgres first Then go run the firehose indexder inside

cd ./indexer

And then go compile it

go build -o indexer ./indexer.go && export $(grep -v '^#' ./../.env | xargs) && ./indexer

Once compiled, you can use rerun.sh to ensure it will automatically recover after failure

Serve #

Make sure the indexer (or at least Postgres) is running first:

go build -o feedgen cmd/main.go && export $(grep -v '^#' ./.env | xargs) && ./feedgen

Logs are pretty verbose, just FYI.

Todo #

Architecture #

Based on go-bsky-feed-generator. Read the README in the linked repo for more info about how it all works. This repository differs from the template by not using the docker system at all.

/pkg/feeds/static #

Basic example feed from the template. Kept as a sanity check if all else seems to fail.

/pkg/feeds/fresh #

Fresh feeds, all built around a shared Following feed builder and logic to set posts as viewed. May contain some remnant old references to the old name "rinds".