Skip to content

Sync fork main into upstream: Tap ingestion, advanced GraphQL queries, and frontend refresh#40

Closed
Kzoeps wants to merge 149 commits intohypercerts-org:mainfrom
GainForest:main
Closed

Sync fork main into upstream: Tap ingestion, advanced GraphQL queries, and frontend refresh#40
Kzoeps wants to merge 149 commits intohypercerts-org:mainfrom
GainForest:main

Conversation

@Kzoeps
Copy link
Copy Markdown

@Kzoeps Kzoeps commented Apr 21, 2026

Summary

This PR syncs the fork’s main branch into upstream main and brings over a large set of backend, frontend, infra, and DX improvements.
The biggest changes are:

  • replacing/augmenting ingestion with Tap sidecar support
  • adding much richer GraphQL querying capabilities
  • refreshing the frontend UI/branding and deployment setup

What’s included

GraphQL / query improvements

  • add per-collection filtering (where) support
  • add sorting support with sortBy / sortDirection
  • add backward pagination (last / before) and page size clamping
  • add opt-in totalCount on public connections
  • add cross-collection search
  • add did and rkey fields to typed record GraphQL types
  • add DB indexes and repository/query updates to support these features
  • add extensive unit and integration test coverage for filter/sort/search/pagination behavior

Tap sidecar integration

  • add internal/tap package with event parsing, consumer, admin client, and handler
  • wire Tap into the app with config/env support and feature flagging
  • add Tap health/status reporting
  • add follow-up fixes for auth, reconnection/backoff, validation, shutdown handling, and safety limits

Frontend / UX refresh

  • redesign the frontend with updated Hyperindex branding
  • add dark mode, theme provider, and theme toggle
  • refresh dashboard, docs, settings, onboarding, lexicons, and backfill pages
  • improve GraphiQL routing and API URL handling
  • make dashboard stats/activity queries public

Admin / product improvements

  • support batch lexicon registration from comma/newline-separated NSIDs
  • add admin DID batch picker UI
  • fix GraphQL NonNull handling for required fields with missing data

DevOps / CI / docs

  • add client Dockerfile and Railway deployment support
  • update CI to run on all PRs and include integration race coverage
  • expand environment variable and deployment docs
  • add project/agent workflow files used in the fork

- Add DIDFilterInput GraphQL type with only eq and in fields (no contains/startsWith/neq)
- Replace StringFilterInput with DIDFilterInput for the did field in WhereInput
- Introduce DIDFilter struct in repositories to carry eq and in conditions
- Update extractFilters to populate DIDFilter.EQ and DIDFilter.IN from GraphQL args
- Add buildDIDFilterClause helper to generate SQL WHERE conditions for DIDFilter
- Update all repository methods to accept DIDFilter instead of plain string
- Add tests for DIDFilterInput fields, extractFilters DID handling, and DID in filtering
Kzoeps and others added 18 commits April 15, 2026 14:50
feat: add batched admin DID picker with Bluesky typeahead
Deploy batch admin add and display
Merge pull request #13 from GainForest/main
…back

- Drop removeFromTap argument from purgeActor mutation and all call sites;
  Tap should not be touched by the indexer (separation of concerns, avoids
  partial-failure state where local data is deleted before Tap call fails)
- Remove RemoveRepoCallback type, field, setter, and startTap wiring
- Wrap DeleteByDID raw error with fmt.Errorf context
- Refactor TestActorsRepository_DeleteByDID to table-driven format

Co-Authored-By: Claude <noreply@anthropic.com>
…d add normalization

- Rename NEXT_PUBLIC_API_URL → NEXT_PUBLIC_HYPERINDEX_URL across all files
- Add NEXT_PUBLIC_HYPERINDEX_URL to env.ts with normalizePublicURL()
- Update HYPERINDEX_URL fallback chain: HYPERINDEX_URL → NEXT_PUBLIC_HYPERINDEX_URL → http://127.0.0.1:8080
- Drop HYPERGOAT_URL entirely from env.ts and graphql/client.ts
- Import env.HYPERINDEX_URL in graphql/client.ts instead of reading process.env directly
- Add inline normalizeUrl helper to next.config.ts (can't import from src/)
- Update Dockerfile ARG/ENV, .env.example comments, and docs/ENV_VARS.md

Co-Authored-By: Claude <noreply@anthropic.com>
Redirect target was resolving to the internal Railway address (0.0.0.0:8080)
instead of the public domain because request.url reflects the internal proxy
address. Fall back to requestUrl.origin for local dev.

Co-Authored-By: Claude <noreply@anthropic.com>
Prevents the GraphiQL endpoint URL from being treated as a relative path
by the browser when EXTERNAL_BASE_URL is set without a protocol prefix,
which caused the hostname to be doubled in the request path.

Co-Authored-By: Claude <noreply@anthropic.com>
Whitespace env values were collapsing to "" inside normalizeUrl/normalizePublicURL,
causing the localhost fallback to never be reached. Apply the fallback via ||
after normalization so blank/whitespace values correctly fall through.

Co-Authored-By: Claude <noreply@anthropic.com>
…alBaseURL

Co-Authored-By: Claude <noreply@anthropic.com>
feat: add actor purge workflow and identity-based cleanup
fix: harden admin purge and env validation
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 21, 2026

@Kzoeps is attempting to deploy a commit to the Hypercerts Foundation Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 21, 2026

Important

Review skipped

Too many files!

This PR contains 151 files, which is 1 over the limit of 150.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e680ee38-fb11-468a-915f-e3543b935d7c

📥 Commits

Reviewing files that changed from the base of the PR and between 9de3ef9 and bf8163a.

⛔ Files ignored due to path filters (1)
  • client/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (151)
  • .agents/skills/deploy-railway/SKILL.md
  • .beads/.gitignore
  • .beads/README.md
  • .beads/config.yaml
  • .beads/interactions.jsonl
  • .beads/issues.jsonl
  • .beads/metadata.json
  • .env.example
  • .githooks/pre-commit
  • .github/workflows/ci.yml
  • .gitignore
  • Makefile
  • README.md
  • client/.env.example
  • client/Dockerfile
  • client/components.json
  • client/next.config.ts
  • client/package.json
  • client/src/app/api/admin/graphql/route.ts
  • client/src/app/api/graphql/route.ts
  • client/src/app/api/oauth/callback/route.ts
  • client/src/app/api/oauth/client-metadata.json/route.ts
  • client/src/app/backfill/page.tsx
  • client/src/app/docs/agents/route.ts
  • client/src/app/docs/page.tsx
  • client/src/app/globals.css
  • client/src/app/graphiql/route.ts
  • client/src/app/layout.tsx
  • client/src/app/lexicons/page.tsx
  • client/src/app/onboarding/page.tsx
  • client/src/app/page.tsx
  • client/src/app/settings/page.tsx
  • client/src/components/ThemeProvider.tsx
  • client/src/components/ThemeToggle.tsx
  • client/src/components/admin/AdminDidBatchPicker.tsx
  • client/src/components/dashboard/ActivityChart.tsx
  • client/src/components/dashboard/RecentActivity.tsx
  • client/src/components/dashboard/StatsCards.tsx
  • client/src/components/layout/GeometricBackground.tsx
  • client/src/components/layout/Header.tsx
  • client/src/components/ui/Alert.tsx
  • client/src/components/ui/Button.tsx
  • client/src/components/ui/Card.tsx
  • client/src/components/ui/Input.tsx
  • client/src/components/ui/badge.tsx
  • client/src/components/ui/command.tsx
  • client/src/lib/auth/client.ts
  • client/src/lib/env.test.ts
  • client/src/lib/env.ts
  • client/src/lib/graphql/client.ts
  • client/src/lib/graphql/mutations.ts
  • client/src/lib/graphql/queries.ts
  • client/src/lib/use-debounce.ts
  • client/src/types/index.ts
  • cmd/hypergoat/main.go
  • cmd/hypergoat/main_test.go
  • docker-compose.postgres.yml
  • docker-compose.tap.yml
  • docker-compose.yml
  • docs/ENV_VARS.md
  • go.mod
  • internal/config/config.go
  • internal/config/config_test.go
  • internal/database/migrations/postgres/006_add_composite_index.down.sql
  • internal/database/migrations/postgres/006_add_composite_index.up.sql
  • internal/database/migrations/sqlite/006_add_composite_index.down.sql
  • internal/database/migrations/sqlite/006_add_composite_index.up.sql
  • internal/database/repositories/actors.go
  • internal/database/repositories/actors_test.go
  • internal/database/repositories/records.go
  • internal/database/repositories/records_filter_test.go
  • internal/database/repositories/records_test.go
  • internal/graphql/admin/handler_test.go
  • internal/graphql/admin/resolvers.go
  • internal/graphql/admin/resolvers_purge_test.go
  • internal/graphql/admin/schema.go
  • internal/graphql/admin/types.go
  • internal/graphql/query/connection.go
  • internal/graphql/query/connection_test.go
  • internal/graphql/schema/builder.go
  • internal/graphql/schema/builder_test.go
  • internal/graphql/types/filters.go
  • internal/graphql/types/filters_test.go
  • internal/graphql/types/mapper.go
  • internal/graphql/types/object.go
  • internal/graphql/types/types_test.go
  • internal/integration/doc.go
  • internal/integration/graphql_filter_test.go
  • internal/integration/integration_test.go
  • internal/lexicon/types.go
  • internal/lexicon/types_test.go
  • internal/oauth/bridge.go
  • internal/oauth/dpop.go
  • internal/oauth/dpop_test.go
  • internal/oauth/middleware_test.go
  • internal/server/graphiql.go
  • internal/server/handlers_test.go
  • internal/server/oauth_handlers.go
  • internal/server/oauth_handlers_test.go
  • internal/tap/admin.go
  • internal/tap/admin_test.go
  • internal/tap/consumer.go
  • internal/tap/consumer_test.go
  • internal/tap/event.go
  • internal/tap/event_test.go
  • internal/tap/handler.go
  • internal/tap/handler_test.go
  • internal/tap/identity_policy_test.go
  • railway.toml
  • testdata/lexicons/app/bsky/richtext/facet.json
  • testdata/lexicons/app/certified/actor/organization.json
  • testdata/lexicons/app/certified/actor/profile.json
  • testdata/lexicons/app/certified/badge/award.json
  • testdata/lexicons/app/certified/badge/definition.json
  • testdata/lexicons/app/certified/badge/response.json
  • testdata/lexicons/app/certified/defs.json
  • testdata/lexicons/app/certified/link/evm.json
  • testdata/lexicons/app/certified/location.json
  • testdata/lexicons/org/hyperboards/board.json
  • testdata/lexicons/org/hyperboards/displayProfile.json
  • testdata/lexicons/org/hypercerts/claim/activity.json
  • testdata/lexicons/org/hypercerts/claim/contribution.json
  • testdata/lexicons/org/hypercerts/claim/contributorInformation.json
  • testdata/lexicons/org/hypercerts/claim/rights.json
  • testdata/lexicons/org/hypercerts/collection.json
  • testdata/lexicons/org/hypercerts/context/acknowledgement.json
  • testdata/lexicons/org/hypercerts/context/attachment.json
  • testdata/lexicons/org/hypercerts/context/evaluation.json
  • testdata/lexicons/org/hypercerts/context/measurement.json
  • testdata/lexicons/org/hypercerts/defs.json
  • testdata/lexicons/org/hypercerts/funding/receipt.json
  • testdata/lexicons/org/hypercerts/helper/workScopeTag.json
  • testdata/lexicons/org/hypercerts/workscope/cel.json
  • testdata/lexicons/org/hypercerts/workscope/tag.json
  • testdata/lexicons/pub/leaflet/blocks/blockquote.json
  • testdata/lexicons/pub/leaflet/blocks/bskyPost.json
  • testdata/lexicons/pub/leaflet/blocks/button.json
  • testdata/lexicons/pub/leaflet/blocks/code.json
  • testdata/lexicons/pub/leaflet/blocks/header.json
  • testdata/lexicons/pub/leaflet/blocks/horizontalRule.json
  • testdata/lexicons/pub/leaflet/blocks/iframe.json
  • testdata/lexicons/pub/leaflet/blocks/image.json
  • testdata/lexicons/pub/leaflet/blocks/math.json
  • testdata/lexicons/pub/leaflet/blocks/orderedList.json
  • testdata/lexicons/pub/leaflet/blocks/page.json
  • testdata/lexicons/pub/leaflet/blocks/poll.json
  • testdata/lexicons/pub/leaflet/blocks/text.json
  • testdata/lexicons/pub/leaflet/blocks/unorderedList.json
  • testdata/lexicons/pub/leaflet/blocks/website.json
  • testdata/lexicons/pub/leaflet/pages/linearDocument.json
  • testdata/lexicons/pub/leaflet/richtext/facet.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • ✅ Review completed - (🔄 Check again to review again)
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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 and usage tips.

@Kzoeps Kzoeps changed the title Fix bugs Sync fork main into upstream: Tap ingestion, advanced GraphQL queries, and frontend refresh Apr 21, 2026
@Kzoeps Kzoeps marked this pull request as ready for review April 21, 2026 06:28
Copy link
Copy Markdown

@claude claude Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This pull request is from a fork — automated review is disabled. A repository maintainer can comment @claude review to run a one-time review.

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.

2 participants