Structured authorial identity that travels with the work across feeds, search, the fediverse, and AI from one source of truth.
This repository ("Author Identity") houses research and planning documents for an experiment in exposing richer, more textured WordPress user metadata that supports a more meaningful conception of authorship on the web.
It also includes the Byline Feed WordPress plugin, which implements the Byline extension vocabulary plus additional author-identity output channels. A normalized author-data layer in WordPress drives multiple outputs.
The mental model: WordPress as a Personal Data Server for authors. Ultimately, with a federated identity, any WordPress user's profile can become their "everything" folder for any content across the web that they're associated with through its production and/or ownership. Most commonly, this association is one of authorship. The Byline Feed plugin makes WordPress speak the open web's existing and emerging formats for asserting authorship. Output channels are reactive to the normalized author data — none of them own it.
This repository has two related parts:
- A documentation set defining the vision, protocol landscape, implementation strategy, and quality gates for portable author identity in WordPress.
- A WordPress plugin, byline-feed, that implements the MVP portion of that strategy.
- Normalize authorial user data from core WordPress, Co-Authors Plus, PublishPress Authors, and the Human Made Authorship plugin.
- Emit structured Byline metadata in RSS2, Atom, and JSON Feed.
- Expose new authorial user metadata like
byline:perspectivefor feed consumers. - Accommodate new authorial user metadata like
byline:perspectivein WordPress data model and user interface. - Emit
fediverse:creatormeta tags in HTML heads for singular content by authors with configured fediverse handles. - Emit multi-author JSON-LD Article + Person output for singular content, including Yoast SEO and Rank Math schema integration modes.
- Enrich Yoast SEO and Rank Math schema output when present, or emit standalone multi-author JSON-LD when no schema-owning SEO plugin is active.
- Preserve all standard feed elements so Byline output remains additive.
- AI-consent signaling: per-author and per-post consent, feed-level and denied-item rights metadata,
robotsmeta for denied posts,TDMRepheaders,ai.txt, and admin-side audit logging.
- Molongui adapter support
- Pre-1.0 Byline spec alignment and terminology cleanup
Longer-range identity work such as did:web: remains in the vision/research layer, not the active roadmap. Current work focuses on the output and adapter tranches without expanding the active roadmap into broader identity-framework work.
| Area | Items |
|---|---|
| Layout | docs/codebase-map.md: Curated repository and plugin tree map |
| Vision | author-identity-vision.md: Full project vision and positioning |
| Planning | implementation-spec.md: Authoritative plugin implementation spec, roadmap, and release gates byline-spec-plan.md: Byline spec assessment — what the plugin validates, current divergences, and pre-1.0 priorities byline-adoption-strategy.md: Adoption strategy — audiences, workstreams, and post-Gate-A product direction fediverse-identity-design.md: Future source-model design for explicit vs derived fediverse identity |
| Research | docs/README.md: Documentation tree index docs/research/README.md: Curated research index with current vs exploratory tiers multi-author-matrix.md: Comparison of WordPress multi-author systems protocol-coverage-map.md: Protocol coverage by output channel architecture.md: HM Authorship architecture notes landscape.md: Plugin ecosystem and historical lineage metadata-models-for-publishers.md: JSON-LD background and longer-term publication metadata context nlweb-yoast-context.md: How Yoast Schema Aggregation and NLWeb relate to the plugin's schema strategy |
| Playground | playground/README.md: Playground demo index playground/output-demo/README.md: Stable output-demo bundle for feeds, fediverse:creator, and JSON-LD |
| Quality | ASSESSMENT.md: Project assessment and recommendations TEST_COVERAGE_MATRIX.md: Coverage status and remaining gaps TDD_TESTING_STANDARD.md: Testing workflow and definition of done |
| Release | RELEASE_CHECKLIST.md: Short operational checklist for packaging and publishing a Byline Feed release |
| Work Packages | wp-01.md to wp-06.md: Detailed delivery specs by package gap-analysis.md: Audit of code against the specs implementation-spec.md: Supplemental strategy details and cross-cutting concerns code-review-plan.md: Post-Gate-A hardening backlog from source/test review |
| Legacy | byline-rss-spec-adoption/: Earlier planning and legacy positioning documents |
| Status | Items |
|---|---|
| Implemented | adapter interface plus core, Co-Authors Plus, PublishPress Authors, and HM Authorship adapters RSS2, Atom, JSON Feed, and JSON-LD output, including profile / now / uses for linked WordPress users via plugin-owned metaYoast SEO and Rank Math schema integration modes for multi-author JSON-LD enrichment content perspective storage and editor UI fediverse:creator meta tags for authors with configured fediverse handlesconservative ap_actor_url resolution for linked WordPress users when ActivityPub identity can be resolvedAI-consent signaling: per-author/per-post consent, feed-level and denied-item rights metadata, robots meta output, TDMRep headers, ai.txt, and admin-side audit loggingruntime validation for the normalized author contract PHPUnit, PHPCS, Playwright E2E, and GitHub Actions CI scaffolding |
| Not yet implemented | Molongui adapter |
| Primary references | byline-feed/ byline-feed/docs/output-reference.md implementation-spec.md wp-01.md to wp-06.md |
For a maintained repository tree, see docs/codebase-map.md.
From byline-feed/:
composer install
composer lint
bash bin/run-phpunit-local.shAlternative when you already have a WordPress test suite and database configured:
WP_TESTS_DIR=/tmp/byline-wp-tests composer testUse bash bin/run-phpunit-local.sh for the default local path on this repo because it provisions a disposable Docker MySQL instance and avoids stale machine-specific socket config. Use composer test directly only when you already have a valid WP_TESTS_DIR plus database configuration in place.
From byline-feed/:
npm install
npm run buildDevelopment-tooling note:
- current npm advisory state is clean after targeted dependency overrides
npm run startstill uses development-only tooling and should be treated separately from shipped plugin runtime behavior- current policy and maintenance expectations are documented in SECURITY.md
| Check | Scope |
|---|---|
| PHPUnit | PHP 7.4 through 8.3 and WordPress 6.0, 6.4, and latest |
| PHPCS | WordPress Coding Standards |
| Node build | Asset build validation |
| Workflow | .github/workflows/ci.yml |
The current Playground strategy is intentionally two-tiered:
- playground/output-demo/ is the stable source-of-truth bundle for demonstrating shipped outputs
- a later adapter-demo blueprint will showcase real Co-Authors Plus and PublishPress Authors integration without burdening the primary public demo
The output-demo README includes direct inspection routes for:
- feeds
- singular
fediverse:creatorand JSON-LD output - denied rights-signaling routes
/ai.txt
The public Playground demo runs the actual byline-feed plugin code, but uses synthetic fixture authors/content via a small demo mu-plugin so the inspection routes stay deterministic.
Use the output-demo bundle locally with:
npx @wp-playground/cli@latest server --blueprint=playground/output-demo/blueprint.jsonBuild a shareable snapshot ZIP with:
playground/bin/build-output-demo-snapshot.shRefresh the published public demo assets with:
playground/bin/publish-output-demo.shThe public Try in Playground CTA now targets the stable codex/playground-assets blueprint URL. Each refresh republishes that stable blueprint while pinning the installed plugin to a fresh immutable source tag for the current commit. Local snapshot ZIPs remain useful for offline sharing, archived demos, and reproducible local inspection.
- Pre-release: Byline Feed 0.1.0-rc3
- Feedback and stabilization: issue #17
| File | Purpose |
|---|---|
| CONTRIBUTING.md | Development, verification, and AI-attribution guidance |
| CHANGELOG.md | Human-readable project change history and release baseline |
| RELEASE_NOTES.md | Release-note convention and release checklist, including AI-assistance disclosure |
| .github/CODEOWNERS | Default review ownership |
| .github/dependabot.yml | Automated dependency update policy |
| .github/PULL_REQUEST_TEMPLATE.md | PR checklist and verification prompts |
| SECURITY.md | Security reporting guidance and accepted-risk notes for development tooling |
Release discipline:
- build the distributable plugin zip with
byline-feed/bin/build-plugin-zip.sh - update
CHANGELOG.mdwhen shipping real releases - draft public release notes using
RELEASE_NOTES.md - include the AI-assistance disclosure note in release notes when AI materially affected the release
Key architectural rules carried through the docs and plugin:
- Byline output is additive and must not replace standard feed elements.
- All output channels consume the same normalized author contract.
- Optional upstream plugin integrations remain optional adapters, not hard dependencies.
- Scope is intentionally constrained to the defined work packages.
This repository includes material changes produced with AI assistance (OpenAI Codex and Anthropic Claude).
Preferred attribution model:
- Repository ownership and accountability remain with the human maintainer.
- Commits with substantial AI-generated changes may include an
Assisted-by:trailer naming the tool used. - AI assistance is disclosed explicitly rather than represented as human co-authorship.
Practical note:
- GitHub's contributor graph reflects commit author identity, not assistance trailers.
- AI tools are disclosed in repository documentation and commit trailers, but are not represented as separate GitHub contributor accounts.
See also: