Skip to content

staging → main: endorsement-graph award links, feedback button visibility, help-page intro - #233

Merged
holkexyz merged 4 commits into
mainfrom
staging
Jul 2, 2026
Merged

staging → main: endorsement-graph award links, feedback button visibility, help-page intro#233
holkexyz merged 4 commits into
mainfrom
staging

Conversation

@holkexyz

@holkexyz holkexyz commented Jul 1, 2026

Copy link
Copy Markdown
Member

Three changes accumulated on staging.

1. feat(endorsement-graph): show award-typed badges as amber toggleable links

Problem

/endorsement-graph only visualized badge awards whose definition has badgeType: "endorsement". Award-typed badges (badgeType: "award") were invisible.

Change

  • Indexer proxy — the AllEndorsements op takes an allowlisted badgeType variable (endorsement | award, defaults to endorsement for older clients; anything else 400s) and now selects the strong-ref subject uri. Award badges usually target records, so the at:// authority of that URI identifies the owning account for the edge. The strong-ref fallback is award-only, so the endorsement graph stays byte-for-byte what it was.
  • Hook — two concurrent paginated scans (one per type); each deduped directed edge carries kind; new totalAwards. Node degrees and all mutual stats stay endorsement-scoped, matching every label that consumes them ("Top endorsers", "Most endorsed", panel counts, node sizing). Award edges never carry the mutual flag.
  • Graph UI — award links render in the theme-aware --color-warning (amber) with a slight always-on curve so they never hide under a parallel endorsement link; legend gains an "Award" row; sidebar gains an "Awards" stat. Two checkboxes ("Endorsements" / "Awards", both on by default) filter the view; the last checked one is disabled so one kind is always visible. The kind filter runs before the evaluator-reachability and mutual-only filters, and hover highlighting, focus zoom, search, and the detail panel (new "Awarded" / "Awarded by" strips) all derive from the filtered view, so hidden edges cannot leak into highlights, counts, or results.

Verification

  • tsc clean, eslint clean, all 937 tests pass, CLAUDE.md UI grep checks silent.
  • The exact shipped GraphQL query was validated against the prod indexer for both badge types (both subject union branches return as expected).
  • A 14-agent adversarial review (4 lenses, per-finding refutation) confirmed 7 issues in the first cut — label/metric mismatches, filter leaks into panel/search/highlighting, a mutual-stats contradiction, a stats-grid orphan cell — all fixed before this landed.

2. fix(feedback): hide the floating button where it's redundant

Problem

The floating "Feedback" button (the app's primary door into the feedback modal) showed up where it shouldn't:

  • On /welcome, which has its own contact CTA and otherwise-minimal landing chrome.
  • Wherever the mobile bottom nav is on screen — that bar already carries a Feedback entry, so the floating button duplicated it and visually overlapped the bar.

Fix

Centralize the bottom nav's show/hide rule in a new isBottomNavVisible helper so <BottomNav> and <FeedbackTrigger> derive visibility from one predicate and can't drift:

isBottomNavVisible = !isDesktop && isStandalone && !/embed && pathname !== "/welcome"
  • src/lib/layout/bottom-nav-visibility.ts (new) — the shared predicate.
  • bottom-nav.tsx — its four early-returns collapse into if (!isBottomNavVisible(...)) return null (same boolean, centralized).
  • feedback-trigger.tsx — hides on /welcome and whenever isBottomNavVisible(...) is true.

Behavior

Context Bottom bar Floating button
Installed PWA, mobile shown (has Feedback) hidden
Mobile browser tab (not installed) not shown shown (nothing to duplicate)
Desktop not shown shown
/welcome (any width) not shown hidden (own CTA)

Both components read useLayoutBreakpoints() and resolve on the same hydration tick, so they hand off together — no window where the bar and the floating button both appear.

3. docs(help): explain what certified.app is

New "What is certified.app?" section on /help, between the intro and the walk-through: certified.app is a view into the whole Certified network — every account, the activities and impact data they publish, and the connections between them (endorsements, follows, groups) — with the data living in each account's AT Protocol repo rather than in the app.

🤖 Generated with Claude Code

The floating feedback button is the app's primary door into the feedback
modal, but it shouldn't appear in two places:

- On /welcome, which has its own contact CTA and minimal landing chrome.
- Wherever the mobile bottom nav is on screen — that bar already carries
  a Feedback entry, so the floating button duplicated it and overlapped
  the bar.

Centralize the bottom nav's show/hide rule in a new isBottomNavVisible
helper (not desktop + standalone + not /embed + not /welcome) so
<BottomNav> and <FeedbackTrigger> derive visibility from one predicate
and can't drift. Both resolve on the same hydration tick, so they hand
off with no window where the bar and the floating button both show. In a
regular mobile browser tab (no bottom bar) the floating button still
shows, as there's nothing to duplicate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
certified-app Building Building Jul 2, 2026 8:41am
certified-app (staging) Ready Ready Preview, Comment Jul 2, 2026 8:41am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@holkexyz, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 47 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7c2c8ab8-c6e9-415f-92f0-e383093fed9f

📥 Commits

Reviewing files that changed from the base of the PR and between 5704b8f and 7f9c14a.

📒 Files selected for processing (9)
  • src/app/api/indexer/route.ts
  • src/app/help/page.tsx
  • src/app/styles/visualization.css
  • src/components/layout/bottom-nav.tsx
  • src/components/layout/feedback-trigger.tsx
  • src/components/visualization/endorsement-graph.tsx
  • src/components/visualization/endorsement-stats.tsx
  • src/hooks/use-endorsement-graph.ts
  • src/lib/layout/bottom-nav-visibility.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch staging

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…links

The graph previously scanned only endorsement-typed badge awards. Now it
also loads badgeType "award" records and draws them as a second edge kind:

- The AllEndorsements indexer op takes an allowlisted badgeType variable
  (defaults to "endorsement" for older clients) and selects the strong-ref
  subject uri, since award-typed badges usually target records; the at://
  authority of that uri identifies the owning account for the edge. The
  strong-ref fallback is award-only so the endorsement graph is unchanged.
- The hook runs one scan per type concurrently, tags each deduped edge
  with its kind, and reports totalAwards. Node degrees and all mutual
  stats stay endorsement-scoped, matching every label that consumes them
  (Top endorsers, Most endorsed, the panel counts, node sizing); award
  edges never carry the mutual flag.
- Award links render in the theme-aware --color-warning with a slight
  always-on curve so they never hide under a parallel endorsement edge;
  the legend gains an Award row and the sidebar an Awards stat.
- Two checkboxes (Endorsements / Awards, both on by default) filter the
  view; the last checked one is disabled so one kind is always shown. The
  kind filter runs before the evaluator-reachability and mutual-only
  filters, and the hover adjacency, detail panel (with new Awarded /
  Awarded by sections), and search all derive from the filtered view so
  hidden edges can't leak into highlights, counts, or results.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@holkexyz holkexyz changed the title fix(feedback): hide the floating button where it's redundant staging → main: award links in the endorsement graph + feedback button visibility Jul 2, 2026
@holkexyz
holkexyz marked this pull request as ready for review July 2, 2026 08:27
New section between the intro and the walk-through: certified.app is a
view into the whole Certified network — every account, the activities
and impact data they publish, and the connections between them — with
the data living in each account's AT Protocol repo rather than in the
app. Links to Explore and the endorsement graph as starting points.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@holkexyz holkexyz changed the title staging → main: award links in the endorsement graph + feedback button visibility staging → main: endorsement-graph award links, feedback button visibility, help-page intro Jul 2, 2026
Drop the Explore / endorsement-graph pointer paragraph and say
"on AT Protocol" without the article.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@holkexyz
holkexyz merged commit c356b42 into main Jul 2, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant