fedify-dev/fedify - Open Source PR Review Scorecard

ActivityPub server framework in TypeScript

C-Rank Grade: A (Welcoming) - 68/100

External PR Merge Rate: 77%

Response Time: 2d

First Timer Success: 73%

Frequently Asked Questions

Is fedify-dev/fedify welcoming to first-time open-source contributors?

fedify-dev/fedify has a recorded first-timer success rate of 72.7%. Repositories ranked A typically provide actionable feedback during code reviews and actively nurture new community contributors.

How fast can I expect code review feedback on my pull request?

Maintainers in fedify-dev/fedify respond to incoming external pull requests in approximately 36.3 hours on average. Keeping PRs focused on single tasks and ensuring tests pass helps maintainers review faster.

What does the 67.9 C-Rank™ score (A Tier) represent?

The C-Rank™ system evaluates GitHub projects on a 0–100 scale using real data: PR merge rates, review turnaround time, active maintainer presence, and first-time contributor success. A score of 67.9 places fedify-dev/fedify in the A tier.

What is the external contributor pull request merge rate for fedify-dev/fedify?

The external contributor pull request merge rate for fedify-dev/fedify is 76.6%, based on public PR activity from non-core contributors.

Are there Good First Issues available in fedify-dev/fedify?

fedify-dev/fedify currently has 12 active issue(s) tagged with beginner-friendly labels like "good first issue", "beginner", or "up-for-grabs".

fedify-dev
fedify-dev/fedifyA•Welcoming1.0k
GitHub
Back to Explorer
fedify-dev

fedify-dev/fedify

1,027
Active (30d)A•Welcoming(68/100)TypeScript

ActivityPub server framework in TypeScript

GitHub
Compare••
Jump to:

AI Maintainer Review Guidelines

Review Persona

Empathetic Technical Mentor

Warmth Score
8.1/10
Patience Score
8.4/10
Nitpick Rate
30%

Highly welcoming maintainers in fedify-dev/fedify. Prompt code reviews with positive guidance for new contributors.

Top PR Submission Do's

  • •Ensure code complies with the project coding style
  • •Keep PRs scoped to a single concern
  • •Include context and link to the related issue

Top PR Friction Pitfalls (Don'ts)

  • •Do not submit PRs without linking an issue
  • •Do not break existing tests without fixing them
  • •Do not mix unrelated refactors in a single PR
Response Velocity
1 days+
Standard maintainer review cycle

Average Response Latency

Tracks hours until a maintainer leaves a review, comment, or PR response.

Merge Efficiency
76.6%
High acceptance rate for external PRs

External Acceptance Rate

Percentage of community pull requests successfully merged into main.

First-Timer Success
72.7%
Strong first-timer PR acceptance rate

First PR Conversion

Rate at which developers submitting their first repository PR succeed.

Active Maintainers
22 core
Highly collaborative maintainer core
Diagnostic Health HUD
76.6%
Merge Gauge
72.7%
1st-Timer
Community Vibe55/100

Embed C-Rank Badge

Show contributors that your repository actively reviews and merges external pull requests.

GetMerged C-Rank badge for fedify-dev/fedify
[![GetMerged C-Rank](https://getmerged.abhishekco.de/api/badge/fedify-dev/fedify)](https://getmerged.abhishekco.de/fedify-dev/fedify?utm_source=github&utm_medium=badge)

Active Good First Issues (5)

View on GitHub

Background MockFederation.setActorDispatcher() in packages/testing/src/mock.ts returns an object whose setKeyPairsDispatcher(), mapHandle(), mapAlias(), and authorize() return the MockFederation itself instead of the setters object. Other mock setters, such as those returned by setObjectDispatcher() and the collection dispatchers, return the federation from authorize() in the same way. So code that chains setters, as the Federation API allows, fails against the mock: federation .setActorDispatcher("/users/{identifier}", dispatcher) .setKeyPairsDispatcher(keyPairsDispatcher) .mapHandle(mapper); // TypeError: mapHandle is not a function mapPortableActorId(), added in #840, already returns the setters object, as does the real implementation. The actor setters also lack mapActorAlias(). Proposed work Make every setters object that the mock returns return itself from its methods, and add the missing mapActorAlias(). Tests chaining every actor setter in any order; chaining authoriz

📅 Opened Sep 28, 2026💬 1 comment
Quality: 90/100Contribute

Why outbox-listener-delivery-required and outbox-listener-delivery-not-awaited both decide which code in an outbox listener can run through collectReachableStatements() in packages/lint/src/lib/reachability.ts. The function already skips an if branch whose test is statically false, but two loop forms are handled inaccurately. CodeRabbit pointed both out while reviewing #1067, where the function was moved into the shared module unchanged; the behavior dates back to #1050. First, a loop whose test is statically false still has its body and update treated as reachable: while (false) { ctx.sendActivity(sender, inbox, activity); } for (;false;) { ctx.sendActivity(sender, inbox, activity); } for (let i = 0; false; ctx.sendActivity(sender, inbox, activity)) {} None of these ever delivers, yet outbox-listener-delivery-required accepts all three listeners, and outbox-listener-delivery-not-awaited reports the unawaited call in the first two although it never runs. A do…while (false) body ru

📅 Opened Sep 26, 2026💬 3 comments
Quality: 90/100Contribute

Why outbox-listener-delivery-required (@fedify/lint) skips a delivery call behind if (false) but counts one inside while (false). The two are equally dead, and isStaticallyFalsy(), the helper that decides the first case, already sits in the same file. federation .setOutboxListeners("/users/{identifier}/outbox") .on(Activity, async (ctx, activity) => { while (false) { await ctx.sendActivity({ identifier: ctx.identifier }, inbox, activity); } console.log(ctx.identifier, activity.id?.href); }); This listener never federates the posted activity, and the rule says nothing. It is a missed detection rather than a false report, so no valid code breaks today. The behavior predates the reachability rewrite in #1050 and is the same in every released version of the rule. Scope In collectReachableStatements(), skip the body of a WhileStatement or a ForStatement whose test is statically falsy. A ForStatement with no test loops forever, so prune only when a test is present

📅 Opened Sep 23, 2026💬 1 comment
Quality: 90/100Contribute

WorkersMessageQueue writes __fedify_ordering_key__ and __fedify_payload__ in enqueue() and enqueueMany(), then reads them back in processMessage(). The wrapper is a wire format with a queue in the middle, and nothing ties the two ends together. Every processMessage() test builds its input by hand: packages/cfworkers/test/mq.test.ts lines 248, 259, 268, 284, 313, 333, 357, and 380, and packages/cfworkers/src/mod.test.ts lines 331, 346, 381, and 389. The producer tests hard-code the same shape on their own side. Change both sides at once and the suite stays green. Add a round trip to packages/cfworkers/test/mq.test.ts. Enqueue a message, take the value that send() received, pass it to processMessage(), and check that the payload and the ordering key survive. Do the same for enqueueMany() with one item's body from the sendBatch() call, which also pins down that both producers agree on the shape. Use the vi.spyOn(env.Q1, …) pattern already in that file rather than adding a mock queu

📅 Opened Sep 22, 2026💬 1 comment
Quality: 90/100Contribute

When resolveFetchedKey in packages/fedify/src/sig/key.ts fetches the document at a keyId URL and parses it as a standalone CryptographicKey or Multikey, it does not check whether the object's id matches the requested URL: let key: T | null = null; if (object instanceof cls) key = object; else if (isActor(object)) { // …iterates keys and matches k.id?.href === keyId } The actor branch compares each candidate with k.id?.href === keyId before accepting it. The standalone branch skips that check. A document served at one URL can therefore declare a different id and still be cached under the requested URL. This came from a security report, but we closed the report because the mismatch does not provide a way to impersonate another actor. The verification path does not use the key document's id to establish the actor's identity. It checks the key's owner or controller against the activity's actor. The current behavior is nevertheless confusing: key.id may differ from the keyId used for th

📅 Opened Jul 20, 2026💬 2 comments
Quality: 90/100Contribute
Looking for more TypeScript beginner tasks?Explore TypeScript GFI

Contributor Community Vibe Feedback

Rate what actually matters after opening a pull request here.

Have you contributed to this repo?

Rate your first-hand PR experience (review speed, maintainer responsiveness, and onboarding ease) to help other contributors.

3 ratings required
Maintainer helpfulness
Review speed
Beginner friendliness

Contributor Compatibility & Review Speed Analysis for fedify-dev/fedify

When evaluating whether to contribute to fedify-dev/fedify, response velocity and maintainer engagement are crucial. GetMerged continuously tracks pull request trajectories, first-comment latency, and code review rounds to help developers avoid submitting pull requests to backlogged repositories.

Currently, maintainers of fedify-dev/fedify acknowledge new external contributions in approximately 1 days+. Out of all submitted pull requests from non-core authors in the last 180-day window, 76.6% were successfully merged into the primary branch.

Frequently Asked Questions - Contributing to fedify-dev/fedify

01

Is fedify-dev/fedify welcoming to first-time open-source contributors?

fedify-dev/fedify has a recorded first-timer success rate of 72.7%. Repositories ranked Welcoming typically provide actionable feedback during code reviews and actively nurture new community contributors.

02

How fast can I expect code review feedback on my pull request?

The initial maintainer response time averages ~1 days+. Keeping PRs scoped to single concerns and ensuring CI checks succeed will optimize review turnaround.

03

What does the 67.9 C-Rank™ score represent?

The C-Rank™ index scores repositories on a 0 to 100 scale using an objective formula: external PR merge rates, initial response speed, active maintainer count, and first-time contributor retention. A score of 67.9 places fedify-dev/fedify in the Welcoming tier.

04

What is the external contributor pull request merge rate for fedify-dev/fedify?

The external pull request merge rate is 76.6%. GetMerged isolates non-core community contributions so external developers get an accurate benchmark of PR acceptance probability.

05

Are there beginner Good First Issues open in fedify-dev/fedify?

Yes, fedify-dev/fedify currently has 12 active issue(s) tagged with beginner-friendly labels. You can inspect these directly from the repository issues tab.

GetMerged C-Rank™ Indexing Standard

All metrics displayed for fedify-dev/fedify are automatically retrieved via the public GitHub API and recalculated daily. Insider pull requests submitted by repository owners or organization members are excluded from merge rate calculations to preserve objective external contributor statistics.