Make your own Bluesky feeds, and host them for free. Gather posts by keyword, people, lists or likes. Filter out the noise. Watch the feed come together live, then publish it to your Bluesky profile
翻訳待ち
ソーシャルTypeScriptGitHub @gitosaurusrexオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Make your own Bluesky feeds, and host them for free. Gather posts by keyword, people, lists or likes. Filter out the noise. Watch the feed come together live, then publish it to your Bluesky profile with one click. No firehose, no always-on server, no monthly bill.
翻訳待ち
Loading the full README.
Read the full README ↗Make your own Bluesky feeds, and host them for free.
Gather posts by keyword, people, lists or likes. Filter out the noise. Watch the feed come together live, then publish it to your Bluesky profile with one click. No firehose, no always-on server, no monthly bill.
In the dashboard, a feed is a form. In code, it's a few lines:
// feeds/cat-pics.ts
export default defineFeed({
id: 'cat-pics',
displayName: 'Cat Pics',
sources: [{ type: 'search', query: 'cat', sort: 'top' }],
filters: { media: 'images', includeKeywords: ['cat*', 'kitten*'], maxAgeHours: 48 },
sort: 'hot',
})
There are two ways to manage feeds, and you can mix them:
feeds/, deployed with the app and published with a command. Supports custom filter
functions. Needs no database.Requires Node 20.12 or newer.
npm install
cp .env.example .env # set BSKY_IDENTIFIER to your handle
npm run preview -- bsky-team # print a feed in the terminal
npm run dev # dashboard at http://127.0.0.1:3000
To try the dashboard editor locally, add TURSO_DATABASE_URL=file:local.db to .env. That stores everything in a
local SQLite file, no Turso account needed. Then open http://127.0.0.1:3000 (not localhost: Bluesky's sign-in
for local apps only returns to 127.0.0.1) and sign in with your handle. You can create and preview feeds locally, but
publishing has to happen from your deployed dashboard, since Bluesky must be able to reach the service.
Deploy first, then publish. Publishing tells Bluesky where your feeds are hosted, so the host has to exist.
Skip this if you only want feeds defined in code.
TURSO_DATABASE_URL and TURSO_AUTH_TOKEN for you.
Untick Production under "Create Database Branch for Deployment" in the connection's settings. Otherwise every
production deploy gets its own fresh copy of the database, and your sign-in and saved feeds seem to vanish after
each deploy. (Published feeds restore themselves from their backups, but nothing else does.) The dashboard footer
shows which database the app is using.libsql://<name>-<org>.turso.io) and create an auth token for it. With the Turso CLI:
turso db show <name> --url and turso db tokens create <name>.The app creates its tables on first use. It also generates the private key it uses to sign its requests to Bluesky,
which keeps you signed in much longer, and stores it in the database alongside your session. To manage
that key yourself instead, run npm run oauth-key and set the printed OAUTH_PRIVATE_KEY, ideally before you first
sign in; changing the key later means signing in again.
Vercel's free Hobby plan suits this best: there are no cold starts long enough to time out Bluesky's request. Note that Hobby is for non-commercial use.
This is the beginning of the README. Read the rest at the original. Read the full README ↗