Figma parity inventory
Every designed RareAS surface is now route-tracked.
This strict TypeScript surface reviews the current figma app, maps each designed feature to its Astro, TanStack, Keycloak, or global-overlay runtime, and records the backend contract that exists today.
38
Designed surfaces
37
GraphQL-first surfaces
15
Astro public routes
21
Tracked gap files
39%
Public route share
1
Staff-only surfaces
Feature implementation matrix
Showing 38 of 38 designed surfaces.
Achievements & XP XP, badges, achievement catalog, progress | Authenticated | GraphQL | TanStack app route | /app/achievements | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. No dedicated achievement resolver is exposed in the current feature schema. | Add GraphQL achievement definitions, user achievement grants, and seasonal rotation metadata before live claims. |
Add To Collection Barcode, photo, shelf, import, manual, voice flows | Authenticated | GraphQL + REST boundary | TanStack app route | /app/collection/add | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes scanSessions, scan candidates, and contribution mutations; binary upload is not GraphQL. | GraphQL scan/session/contribution mutations; REST remains reserved for binary media upload. |
Admin Panel Users, catalog, moderation, marketplace, messaging, mobile, analytics, security, settings | Staff | GraphQL + REST boundary | TanStack app route | /app/admin | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Staff-only route guard is local frontend plus GraphQL me.isStaff; current feature schema exposes adminAuditEvents. | Keep the staff route guard and add RBAC-scoped GraphQL admin operations per module. |
AI Shelf Scan Image upload, confidence candidates, review/confirm workflow | Authenticated | GraphQL + REST boundary | TanStack app route | /app/scans/ai | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes scanSessions and scan candidates; media upload should stay REST. | REST for image upload; GraphQL for scan session, candidates, and resolution. |
Authentication Sign in, sign up, forgot password | Public | REST boundary | Keycloak route | /auth/sign-in | Current auth boundary is Keycloak OIDC at /auth/sign-in, /auth/callback, /auth/sign-out, and /auth/silent-renew; Django validates Bearer tokens with KeycloakAuthentication. Local JWT token endpoints only exist when ENABLE_LOCAL_JWT_AUTH=true. | Keep OIDC/Keycloak as the auth boundary; frontend handles redirects, callback state, and session storage. |
Barcode Scanner Camera/USB/paste/CSV modes, candidate disambiguation, contribution fallback | Authenticated | GraphQL | TanStack app route | /app/scans/barcode | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current catalog schema can search by UPC and the feature schema exposes scan sessions. | Use GraphQL barcode resolver and unresolved-scan contribution workflow. |
Brand Hub Microsoft/Xbox family hub, product lines, signals | Public | GraphQL | Astro route | /brands/microsoft | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. Brand slug routes are static today; backend company lookup needs slug parity. | Bind to company slug, product families, editorial collections, and catalog counts. |
Brands Directory Featured brands, trending brands, A-Z index | Public | GraphQL | Astro route | /brands | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. Company data exists through allCompanies/company nodes; product-family slices remain frontend fixtures. | Keep brand browsing as SEO Astro pages while replacing showcase fixtures with company/product family data. |
Catalog Database Browse grid/list, advanced filters, sort, ownership tags | Public | GraphQL | Astro route | /database | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. | Strict TanStack Query/Table route uses typed filters and should keep mapping to Django catalog connections. |
Categories Beyond Games Games, movies, music, TCG, toys, memorabilia, sports, comics, watches, coins, stamps | Public | GraphQL | Astro route | /categories | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. Category data exists through allCategories/category nodes; category profile copy remains fixture-backed. | Use category profiles, category attributes, rarity rules, and landing-page slices from backend data. |
Collection Stats, grid/list, filters, bulk selection, share card, import, trash | Authenticated | GraphQL | TanStack app route | /app/collection | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current catalog schema exposes myCollection, allCollectionItems, collectionGroups, and collectionCopies. | Replace remaining local collection fixtures with owner-filtered GraphQL collection copies and groups. |
Collection To Feed Post-on-add, bulk auto-drafts, review queue, anti-spam | Authenticated | GraphQL | TanStack app route | /app/feed/drafts | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feedPosts exist, but a dedicated draft queue contract is not exposed yet. | Add GraphQL draft creation and moderation state before public publishing automation. |
Compare & Analytics Collection comparisons, overlap, mirrored bars, analytics snapshots | Authenticated | GraphQL | TanStack app route | /app/compare | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes analyticsSnapshots; collection comparison UI is still fixture-first. | Back with analytics snapshot and collection compare queries. |
Connections Followers, following, groups, mute, block, restrict | Authenticated | GraphQL | TanStack app route | /app/connections | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes following, myBlocks, follow, and block operations. | GraphQL social graph mutations plus privacy/block enforcement. |
Contributions & Moderation Contribution form, trust tier, moderation queue, diff viewer, appeals | Authenticated | GraphQL | TanStack app route | /app/contribute | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes catalogContributions and contribution mutations. | GraphQL contribution submission and staff moderation operations. |
Developer API API reference, keys, OAuth, usage, webhooks, deprecations | Public | GraphQL | Astro route | /developers | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Current feature schema exposes developerClients, persistedGraphqlOperations, and webhookSubscriptions. | GraphQL developer clients, persisted operations, usage logs, and webhook subscriptions. |
GameScan & Connected Stores Store connectors, unified library, sync sessions, admin/mobile panels | Public | GraphQL + REST boundary | Astro route | /gamescan | Current GameScan runtime boundary is REST: /api/v1/me/profile/, /api/v1/gamescan/sync/, and /api/v1/gamescan/sessions/. Public /gamescan is an Astro route. | Keep existing GameScan REST sync boundary; use GraphQL only for future library, sessions, and dashboards when implemented. |
Global Command Palette Cmd-K sections, recent actions, saved searches, quick add | Authenticated | GraphQL | Global overlay | global overlay | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Current relevant fields include savedSearches and catalog search; there is no standalone URL route. | Keep it mounted in AppChrome; add GraphQL search/action providers without inventing a static page. |
Grading & Authentication Cert lookup, slabs, population, submit-to-grading, authenticity alerts | Authenticated | GraphQL + REST boundary | TanStack app route | /app/grading | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes gradingRecords; external cert callbacks/webhooks stay REST. | GraphQL grading records and cert metadata; REST only for external webhook/callback boundaries. |
Home Hero, rarity ladder, trending grails, scan CTAs | Public | GraphQL | Astro route | / | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. Public home still falls back to strict fixtures when optional GraphQL fails. | Keep home route public and SEO-safe; hydrate trending, grails, and rarity bands from backend queries when available. |
Item Detail Gallery, rarity score, family strip, reviews, price intelligence, owner social proof | Public | GraphQL | Astro route | /items/stadium-events | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. Item pages are static Astro slugs today and still need slug-backed live lookup parity. | Replace fixture lookup with slug query, item variants, rarity explanation, reviews, and contribution tabs. |
Leaderboards Podium, ranks table, board filters, rival, opt-out | Public | GraphQL | Astro route | /leaderboards | Current Django repo has a leaderboards app, but no public REST route is exposed in rareas_backend/urls.py; this Astro page is fixture-backed today. | Use GraphQL or a real public endpoint for leaderboard windows and user opt-out state before claiming live ranks. |
Localization & Currency Locale, currency, FX, translation status, legal copy | Authenticated | GraphQL | TanStack app route | /app/localization | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes currencyRates and privacy preference locale/currency fields. | GraphQL currency rates, user preferences, regional releases, and translated catalog fields. |
Marketplace Wishlist on sale, last-minute auctions, target deltas, recommendations, affiliate disclosure | Authenticated | GraphQL | TanStack app route | /app/marketplace | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes marketplaceListings and latestMarketSummary. | GraphQL lanes should be personalized and filtered by user wishlist and trust signals. |
Messages Direct messages, group conversations, reports, abuse controls | Authenticated | GraphQL | TanStack app route | /app/messages | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes conversations and messages; subscriptions can follow later. | GraphQL conversation/message operations remain the current contract; real-time subscriptions can follow later. |
Mobile App Companion Native app preview, scan tab, offline sync, push, deep links | Mobile companion | GraphQL + REST boundary | Astro route | /mobile | Current web route is public Astro documentation. Native app APIs should use the same Keycloak, GraphQL, GameScan REST, and upload boundaries as the web app. | Frontend documents mobile parity; native apps use GraphQL sync plus REST upload/update boundaries. |
Notifications Notification center, unread state, channels, preferences | Authenticated | GraphQL | Global overlay | global overlay | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Current feature schema exposes notifications and notification mutations; there is no standalone URL route. | Keep mounted in chrome; use notification list/preference queries and mark-read mutation. |
Onboarding Profile setup, collecting interests, first three owned items | Authenticated | GraphQL | TanStack app route | /app/onboarding | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. | Use TanStack Form and GraphQL mutations for profile, privacy defaults, and seed collection items. |
Pricing & Tiers Free/Pro/Creator plans, feature matrix, FAQs, checkout prompts | Public | GraphQL + REST boundary | Astro route | /pricing | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Current feature schema exposes entitlementPlans and myEntitlements; payment provider callbacks are not GraphQL. | GraphQL plan/entitlement read model; payment provider callbacks stay REST. |
Profile Public profile, stats, collection previews, activity, badges | Authenticated | GraphQL | TanStack app route | /app/profile | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current profile authorization fields include publicProfilePermissions and privacyPreferences. | Enforce privacy matrix and route-level user handle support. |
Rarity Scoring Rarity calculator, scale showcase, why-this-score drawer | Public | GraphQL | Astro route | /items/stadium-events | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Current feature schema exposes rarityProfile and rarity workflow mutations. | Use rarity profile, history, confidence, and explainability fields from GraphQL. |
Reviews, Discussion, Q&A Reviews, helpful votes, threaded comments, questions, reports | Public | GraphQL | Astro route | /items/stadium-events | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Current feature schema exposes reviews and review mutations; discussion and Q&A remain separate future slices. | Item tabs should fetch reviews/discussion with object authorization and moderation state. |
Search Results Catalog/users/collection/wishlist/reviews/discussion tabs | Public | GraphQL | Astro route | /search | Current Django GraphQL catalog fields include allItems, searchItems, allCategories, allCompanies, myCollection, and collection mutations at /api/graphql when ENABLE_GRAPHQL=true. Current backend search is searchItems; people, reviews, and discussion tabs are not runtime-backed yet. | Wire tabs to typed GraphQL search queries and persisted operation rules as each backend slice exists. |
Settings, Privacy, Security Privacy, 2FA, sessions, notifications, billing, export, deletion | Authenticated | GraphQL + REST boundary | TanStack app route | /app/settings | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Preferences are GraphQL; OIDC session and security controls remain Keycloak boundaries. | GraphQL for preferences; REST/OIDC boundaries for session and security provider redirects. |
Social Feed Activity feed, post cards, composer, reactions, comments | Authenticated | GraphQL | TanStack app route | /app/feed | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes feedPosts, reviews, follows, and feed post mutations. | Use feed posts, reactions, comments, reports, and privacy-aware actor fields. |
Valuation & Insurance Valuation snapshot, insurance packet, report order, claim builder, verify URL | Authenticated | GraphQL + REST boundary | TanStack app route | /app/valuation | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes valuationReports and valuation workflow mutations; binary/PDF exports stay REST. | GraphQL valuation reports and jobs; REST for PDF/binary export downloads. |
Variants & Families Product family tree, variant comparison, prototype/retail/region filters | Public | GraphQL | Astro route | /database/original-xbox/variants | Current Django GraphQL feature fields live behind /api/graphql when ENABLE_GRAPHQL=true and are authorized by Keycloak bearer tokens plus the me viewer query. Relevant current fields include catalogVariants and itemIdentifiers. | Back static variant fixtures with catalog variant and regional release GraphQL queries. |
Wishlist & Price Targets Targets, alert toggles, marketplace lane, check prices drawer, bulk actions | Authenticated | GraphQL | TanStack app route | /app/wishlist | Current runtime is a pre-rendered Astro /app route hydrated by the TanStack router; access is gated by Keycloak OIDC storage and the Django GraphQL me query. Current feature schema exposes wishlistTargets, marketplaceListings, and priceObservations. | Wire target, marketplace, price observation, and alert preference flows to GraphQL. |
Frontend gap tracker
These rows are keyed to the 21 numbered files inFeatures/FrontendGapAnalysisand keep Figma, routes, GraphQL operations, hooks, and tests connected.
| Gap file | Workstream | Status | Routes | GraphQL operations | Frontend hooks | Tests |
|---|---|---|---|---|---|---|
Design system and tokens 01-design-system-and-tokens.md | Design system | Route foundation | /features | No direct GraphQL operation; token and visual-system parity only | No hook; shared theme CSS and rarityBrand constants | apps/web/tests/e2e/public-routes.spec.ts |
Homepage 02-homepage.md | Discovery | Fixture-first | / | RareAsHomeallItemssearchItems | useHomeData | apps/web/tests/e2e/public-routes.spec.ts |
Auth and onboarding 03-auth-and-onboarding.md | Auth/access | In progress | /auth/sign-in/app/onboarding | memyTwoFactorStateonboarding/profile mutations needed | auth.ts OIDC helpersuseSettingsAccount for session-adjacent account state; onboarding mutation hook missing | apps/web/tests/e2e/live-keycloak-login.spec.ts |
Catalog and database 04-catalog-and-database.md | Discovery | Live GraphQL | /database/categories/brands/brands/microsoft | RareAsCatalogallItemssearchItemsallCategoriesallCompanies | useCatalog | apps/web/tests/e2e/public-routes.spec.ts |
Item detail 05-item-detail.md | Discovery | Fixture-first | /items/stadium-events/database/original-xbox/variants | RareAsItemDetailRareAsItemDetailLookupreviewsrarityProfilemarketplaceListings | useItemDetailusePublicItemReviews | apps/web/tests/e2e/public-routes.spec.ts |
Collection management 06-collection-management.md | Collector | In progress | /app/collection/app/collection/add/app/compare | RareAsCollectionmyCollectioncollectionGroupsaddToCollectionupdateCollectionItem+1 | useCollectionuseAddToCollectionMutationuseUpdateCollectionItemMutationuseRemoveFromCollectionMutation | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Wishlist and prices 07-wishlist-and-prices.md | Collector | In progress | /app/wishlist/app/marketplace | RareAsWishlistmyCollection WISHLIST/WANT_TO_BUY statuseswishlistTargetsmarketplaceListingspriceObservations+1 | useWishlistuseUpsertWishlistTargetMutationuseUpsertWishlistTargetBusinessMutation | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Search and command palette 08-search-and-command-palette.md | Discovery | In progress | /search/app/search | RareAsSearchsearchItemssearchCatalogBusiness neededcommandPaletteBusiness neededsavedSearches needed | useSearch | apps/web/tests/e2e/public-routes.spec.ts |
Social feed 09-social-feed.md | Community | Fixture-first | /app/feed/app/feed/drafts | RareAsFeedPostsRareAsFeedCommentscreateFeedPostBusinesscreateFeedCommentBusinesssetFeedReactionBusiness | useFeedPostsuseFeedCommentsuseCreateFeedPostMutationuseCreateFeedCommentMutationuseSetFeedReactionMutation | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Reviews and discussion 10-reviews-and-discussion.md | Community | Fixture-first | /items/stadium-events | RareAsReviewsupsertItemReviewBusinesssetHelpfulVoteBusinessreportContentBusiness | useReviewsusePublicItemReviewsuseUpsertItemReviewMutationuseSetHelpfulVoteMutation | apps/web/tests/e2e/public-routes.spec.ts |
Profile and following 11-profile-and-following.md | Community | Fixture-first | /app/profile/app/connections | RareAsFollowingpublicProfilePermissionsmyBlocksfollowUserBusinessunfollowUserBusiness | useFollowinguseSettingsAccountuseFollowUserMutationuseUnfollowUserMutation; profile/privacy hooks missing | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Leaderboards and achievements 12-leaderboards-and-achievements.md | Community | Fixture-first | /leaderboards/app/achievements | leaderboardSummary neededmyAchievements needed | No hook yet; leaderboard and achievement pages are fixture-backed | apps/web/tests/e2e/public-routes.spec.tsapps/web/tests/e2e/app-chrome-parity.spec.ts |
Notifications and messaging 13-notifications-and-messaging.md | Community | Fixture-first | /app/messages | RareAsNotificationsRareAsConversationsRareAsConversationMessagesmarkNotificationReadcreateMessageBusiness+1 | useNotificationsuseConversationsuseConversationMessagesuseMarkNotificationReadMutationuseCreateMessageMutation+1 | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Settings and pricing 14-settings-and-pricing.md | Auth/access | In progress | /app/settings/pricing | RareAsPlatformRevenueGapprivacyPreferences needednotificationPreferencesentitlementPlansmyEntitlements+1 | useSettingsAccountusePlatformRevenueGapuseUpsertNotificationPreferenceMutation; profile/privacy/billing hooks missing | apps/web/tests/e2e/app-chrome-parity.spec.tsapps/web/tests/e2e/public-routes.spec.ts |
Contributions and moderation 15-contributions-and-moderation.md | Moderation | In progress | /contribute/app/contribute/app/admin | CatalogContributionsModerationReportsLegalReviewQueueItemssubmitCatalogContributionBusinessreviewCatalogContributionBusiness | useCatalogContributionsuseModerationReportsuseReviewQueueItemsuseSubmitCatalogContributionMutationuseReviewCatalogContributionMutation | apps/web/tests/e2e/contribute-parity.spec.ts |
AI scan and capture 16-ai-scan-and-capture.md | Scan/mobile | Fixture-first | /app/scans/ai/app/scans/barcode/app/collection/add | ScanSessionsScanProviderJobscreateScanSessionresolveScanSessionresolveBarcodeScanBusiness | useScanSessionsuseScanProviderJobsuseResolveScanSessionMutationuseResolveBarcodeScanMutation | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Navigation and app shell 17-navigation-and-app-shell.md | Auth/access | In progress | //app/collection/app/profile/app/admin | me viewer query for gated nav; no page-specific operation | auth.ts viewer refreshcanAccessAppPageAppChrome state; useNavigationAccess hook not created | apps/web/tests/e2e/app-chrome-parity.spec.tsapps/web/tests/e2e/public-routes.spec.ts |
Marketplace and valuation 18-marketplace-and-valuation.md | Revenue | Fixture-first | /app/marketplace/app/valuation | RareAsPlatformRevenueGapRareAsLatestMarketSummarymarketplaceListingsvaluationReportsgenerateValuationReport+1 | usePlatformRevenueGapuseLatestMarketSummaryuseGenerateValuationReportMutationuseRecordPriceObservationMutation | apps/web/tests/e2e/app-chrome-parity.spec.ts |
Developer portal and API 19-developer-portal-and-api.md | Platform | Fixture-first | /developers | RareAsPlatformRevenueGapRareAsDeveloperApiKeysdeveloperClientspersistedGraphqlOperationswebhookSubscriptions+2 | usePlatformRevenueGapuseDeveloperApiKeysuseUpsertDeveloperClientMutationuseRegisterPersistedGraphqlOperationMutationuseIssueDeveloperApiKeyMutation+2 | apps/web/tests/e2e/public-routes.spec.ts |
Mobile and GameScan 20-mobile-and-gamescan.md | Scan/mobile | Fixture-first | /mobile/gamescan | GameScan REST /api/v1/gamescan/profile/GameScan REST /api/v1/gamescan/sessions/GameScan REST /api/v1/gamescan/sync/future gamescanLibraryBusiness GraphQL | useGameScanProfileuseGameScanSessionsuseGameScanSync | apps/web/tests/e2e/public-routes.spec.ts |
API layer and data 21-api-layer-and-data.md | API/data | In progress | /features | runFeatureQueryrunFeatureMutationcodegen schema.graphqlmeallItems+3 | graphqlRequestrunFeatureQueryrunFeatureMutationfeature hooks in apps/web/src/app/api | pnpm --filter @rareas/web validate:graphqlpnpm --filter @rareas/web typecheck |