Serve every author as an OpenProfile.md, and let the person correct it - #191
Merged
Conversation
The directory already knew who is behind a feed, from the markup they
published: a rel="me" link, an h-card, the feed's own author element.
That knowledge now leaves the site as one portable file per person,
/authors/{slug}/openprofile.md (logicsrc.com/openprofile), pointed at by
<link rel="openprofile"> on their page: identity block, Accounts, Topics
from their feeds, and a Broadcast section (logicsrc.com/openbroadcast)
for every podcast or show they own, saying only what their own feed
says. Nothing the person did not write is filled in: no Seeking, Pays or
Charges, no Guest section, and no email even where the API republishes
one. GET /api/authors?feed={url} finds the people behind a feed, so a
directory that holds only feed URLs can reach them.
Then the person's word over ours. A claim is verified on the spot: the
signed-in address is the one they published, or their site links back at
the profile. After that the file is theirs to correct from anywhere, and
every way in stores the same overlay (@profullstack/openprofile): the
edit form at /authors/{slug}/edit, PUT /api/authors/{slug}/openprofile
as the whole file or a JSON patch under an API key or an OpenAccess grant
for openprofile:edit, rssamp profile edit from the CLI, update_openprofile
over MCP. What they wrote wins per section, what they left alone is still
generated, and `none` drops a section. A public switch hides the file
without touching the page.
Also: authorBySlug now reads the live `category` under the `kind` name,
which the author page and get_author already expected; the old column
said blog for every podcast.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S7yeJUHGxA4P5N74xnsRPQ
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
This was referenced Sep 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of the OpenProfile rollout (Anthony, 2026-09-13: p0dcasters needs OpenProfiles from rssamplifier; anywhere OpenProfile is implemented the person can edit it via API, CLI, MCP, web).
Serve
GET /authors/{slug}/openprofile.md: the author as OpenProfile.md via@profullstack/openprofile. Identity (Kind, Handle, Web, Avatar), headline from the bio, Accounts fromauthor_links, Topics from their feeds' keywords, a Broadcast section (OpenBroadcast) per show they own (### <show>groups when several) with Show, Kind, Language, Since, Feed, Listen, Topics only. Never Seeking/Pays/Charges/Guest, never Email unless the owner adds it.<link rel="openprofile">on/authors/{slug}, a Profile row with the file and a "this is me" button;openprofileURL in/api/authors,/api/authors/{slug},/api/feeds/{slug}.authors, MCPget_author; llms.txt, skill.md, README.GET /api/authors?feed={url}: the people behind one feed, owner first.get_openprofile(by slug or feed URL).Claim and edit
20260913042000_author_profiles(overlay JSON, public switch, owner account and/or OpenAccess principal, claim method).POST /api/authors/{slug}/claim: verified automatically by email equality with the published address, or by the site linking back withrel="openprofile"/rel="me"(fetched, 8s, 512 KB). Admin fallback viaADMIN_EMAILS. 401 / 403 / 409 as appropriate.PUT /api/authors/{slug}/openprofile:text/markdown(whole file, dropped sections dropped) or JSON patch (name,headline,prose,identity,sections,public, ormarkdown). Auth: session cookie, anrsa_API key, or an OpenAccess bearer withopenprofile:edit(@logicsrc/openaccess; scope added to/.well-known/openaccess.json). POST is the same for the HTML form./authors/{slug}/edit(one box per part, public checkbox); claimed profiles listed on/account.rssamp profile <slug>/--feed <url>,profile claim <slug>,profile edit <slug> [--file](opens$EDITOR, sends only if changed);--token,RSSAMPLIFIER_TOKEN,OPENACCESS_TOKEN.update_openprofile,claim_openprofile(credential in the Authorization header); listed inopenmcp.json.Fix on the way:
authorBySlugread the legacyfeeds.kind(alwaysblog); it now readscategoryunder that name, so the author page andget_authorsay podcast for a podcast.Tests:
packages/db/test/profiles.test.js,apps/web/test/openprofile.test.js(generator, overlay round trip, form, claim verdicts, linkback, OpenAccess principal),apps/cli/test/profile.test.js;pnpm testgreen. Smoke against a local file database with a seeded author: the file, the JSON shape,?feed=lookup, the link rel, 401s, claim by email under an API key, PUT patch, MCP get/update, public off then 404.🤖 Generated with Claude Code
https://claude.ai/code/session_01S7yeJUHGxA4P5N74xnsRPQ