B2BEA.org Current Site Reverse Engineering v1
research artifact · for B2BEA.org Rebuild · status approved
research artifact · for B2BEA.org Rebuild · status approved
No explicit evidence field yet. Require tests, screenshots, linked PRs, or reviewed outputs before marking complete.
- scope: Current-state audit only. Capability catalog is intentionally deferred until after this reverse-engineering pass is reviewed.
- title: B2BEA.org Current Site Reverse Engineering v1
- layouts: 9 items
- version: 1
- partials: 19 items
- surfaces: auth: object, b2bea_admin: object, public_site: object, member_dashboard_profile: object, vendor_management_portal: object, practitioner_company_workspace: object
- project id: a820dd0c-6cef-4133-bfbd-d802fd806e44
- updated at: 2026-05-06T19:13:19.768Z
- source repo: /Users/justinking/Vaults/Projects/B2BEA-org-new
- css findings: 4 items
- data modules: 35 items
- artifact type: research
Machine-readable source fields
Current-state audit only. Capability catalog is intentionally deferred until after this reverse-engineering pass is reviewed.
B2BEA.org Current Site Reverse Engineering v1
- src/_includes/layouts/admin.njk
- src/_includes/layouts/article.njk
- src/_includes/layouts/auth.njk
- src/_includes/layouts/base.njk
- src/_includes/layouts/editorial.njk
- src/_includes/layouts/page.njk
- src/_includes/layouts/portal.njk
- src/_includes/layouts/studio.njk
- src/_includes/layouts/vendor-landing.njk
1
- src/_includes/partials/admin-nav.njk
- src/_includes/partials/admin-rebuild.njk
- src/_includes/partials/case-study-card.njk
- src/_includes/partials/content-card.njk
- src/_includes/partials/course-card.njk
- src/_includes/partials/exchange-card.njk
- src/_includes/partials/footer.njk
- src/_includes/partials/nav.njk
- src/_includes/partials/person-card.njk
- src/_includes/partials/portal-nav.njk
- src/_includes/partials/search-modal.njk
- src/_includes/partials/studio-nav.njk
- src/_includes/partials/topic-concepts.njk
- src/_includes/partials/topic-cta.njk
- src/_includes/partials/topic-featured.njk
- src/_includes/partials/topic-hero.njk
- src/_includes/partials/topic-section.njk
- src/_includes/partials/vendor-card.njk
- src/_includes/partials/vendor-people.njk
Login, signup, confirm email, OAuth, password/magic-link flows.
- src/confirm-email/index.njk
- src/login/index.njk
- src/signup/index.njk
Auth should be treated as a shared cross-surface capability with clear return URLs and role-aware routing.
Internal platform operations for users, vendors, companies, categories, academy, jobs, Studio/media, and dashboard metrics.
- src/admin/academy/course.njk
- src/admin/academy/index.njk
- src/admin/academy/lesson.njk
- src/admin/categories/index.njk
- src/admin/companies/index.njk
- src/admin/index.njk
- src/admin/jobs/index.njk
- src/admin/users/index.njk
- src/admin/vendors/index.njk
- src/studio/index.njk
- src/studio/media/index.njk
Should become an app surface with consistent tables, filters, forms, drawers/modals, detail panels, permissions, audit states, and bulk actions.
Marketing, editorial, search/discovery, public directories, resources, learning previews, conversion, public profiles, and public vendor pages.
- src/agencies/index.njk
- src/assessments/index.njk
- src/assessments/maturity/index.njk
- src/assessments/maturity/results/index.njk
- src/assessments/maturity/take/index.njk
- src/authors/author.njk
- src/blog/index.njk
- src/blog/post.njk
- src/careers/index.njk
- src/careers/job.njk
- src/case-studies/case-study.njk
- src/case-studies/index.njk
- src/concepts/ai-product-recommendations-b2b.njk
- src/concepts/concept.njk
- src/concepts/index.njk
- src/consultants/index.njk
- src/courses/course.njk
- src/courses/index.njk
- src/courses/lessons/lesson.njk
- src/courses/modules/challenge-feedback.njk
- src/courses/modules/challenge.njk
- src/courses/modules/test.njk
- src/distributors/index.njk
- src/events/event.njk
- src/events/index.njk
- src/exchange/exchange.njk
- src/exchange/index.njk
- src/for/agencies/index.njk
- src/for/consultants/index.njk
- src/for/distributors/index.njk
- src/for/manufacturers/index.njk
- src/for/software-providers/index.njk
- src/for/vendors/index.njk
- src/guides/guide.njk
- src/guides/index.njk
- src/how-we-use-ai/index.njk
- src/index.njk
- src/insights/index.njk
- src/leaders/index.njk
- src/manufacturers/index.njk
- src/pages/about.njk
- src/pages/checkout-success.njk
- src/pages/checkout.njk
- src/pages/contact.njk
- src/pages/join.njk
- src/pages/membership-terms.njk
- src/pages/services.njk
- src/pages/terms.njk
- src/pages/upgrade.njk
- src/pages/vendor-application.njk
- src/pages/vendor-membership.njk
- src/people/index.njk
- src/people/person.njk
- src/podcast/episode.njk
- src/podcast/index.njk
- src/reports/index.njk
- src/reports/report.njk
- src/resources/2026-b2b-ecommerce-trends/download.njk
- src/resources/2026-b2b-ecommerce-trends/index.njk
- src/resources/career-acceleration-kit/download.njk
Should become mostly template-driven with explicit page families and component contracts.
Personal dashboard, account settings, profile editing, knowledge profile, onboarding, welcome/pro state.
- src/account/index.njk
- src/dashboard/index.njk
- src/dashboard/onboarding/index.njk
- src/dashboard/profile/edit.njk
- src/dashboard/profile/knowledge.njk
- src/dashboard/profile.njk
- src/dashboard/welcome/index.njk
Should define individual identity, public profile projection, learning activity, membership entitlements, saved items, account/security, and career activity.
Vendor claim and vendor profile/content/analytics portal. Current portal has profile, case studies, blog, analytics, and coming-soon areas for events/team/resources/courses.
- src/exchange/vendor-claim.njk
- src/vendor-portal/index.njk
Should be its own company workspace for vendors selling into the ecosystem, distinct from practitioner company workspaces.
Not present as a first-class surface in the current repo.
No items captured.
Needs net-new spec for company admins managing employee seats, academy access, career benefits, membership ownership, and company-level participation.
a820dd0c-6cef-4133-bfbd-d802fd806e44
2026-05-06T19:13:19.768Z
/Users/justinking/Vaults/Projects/B2BEA-org-new
- src/assets/css/style.css is the dominant legacy stylesheet at roughly 14.9k lines and 2.4k selector blocks; this is the major design-system risk.
- src/assets/css/lovable-system.css currently acts as an overlay/normalization layer rather than the sole source of truth.
- admin.css, portal.css, studio.css, survey.css, search.css, and how-we-use-ai.css are separate surface/page stylesheets that need consolidation decisions.
- Many templates contain inline <style> blocks. These should be classified as discard, migrate-to-component, or true one-off editorial exceptions.
| file | rest tables | source types |
|---|---|---|
| src/_data/allContent.js | - sanity - fetch | |
| src/_data/allResources.js | - sanity | |
| src/_data/assessment.json | - static_json | |
| src/_data/authors.js | - people | - supabase |
| src/_data/blogPosts.js | - sanity - fetch | |
| src/_data/caseStudies.js | - sanity - fetch | |
| src/_data/conceptPages.js | ||
| src/_data/concepts.js | - sanity - fetch | |
| src/_data/contentQuality.js | ||
| src/_data/courses.js | - supabase | |
| src/_data/events.js | - supabase | |
| src/_data/flatLessons.js | ||
| src/_data/guides.js | - sanity - fetch | |
| src/_data/homepageFeaturedPeople.js | - people | - supabase |
| src/_data/hubCategories.js | - supabase | |
| src/_data/jobs.js | - supabase | |
| src/_data/leaders.js | - people | - supabase |
| src/_data/membershipTiers.js | - supabase | |
| src/_data/people.js | - people | - supabase |
| src/_data/podcastEpisodes.js | - podcast_episodes | - supabase |
| src/_data/podcastVideoEnrichment.js | ||
| src/_data/podcasts.js | - fetch | |
| src/_data/reports.js | - sanity - fetch | |
| src/_data/sanityClient.js | - sanity | |
| src/_data/sanityEvents.js | - supabase - sanity - fetch | |
| src/_data/sanityLessons.js | - supabase - sanity - fetch | |
| src/_data/site.js | ||
| src/_data/subcategories.js | - supabase | |
| src/_data/supabaseClient.js | - supabase | |
| src/_data/vendorCategories.js | - supabase | |
| src/_data/vendorEvents.js | - supabase | |
| src/_data/vendorPeople.js | - people - vendors | - supabase |
| src/_data/vendors.js | - supabase | |
| src/_data/vendorsForPagination.js | ||
| src/_data/womenInB2b.js | - people | - supabase |
research
| file | lines | important count | selectors approx |
|---|---|---|---|
| src/assets/css/admin.css | 986 | 1 | 161 |
| src/assets/css/how-we-use-ai.css | 451 | 0 | 77 |
| src/assets/css/lovable-system.css | 1815 | 16 | 212 |
| src/assets/css/portal.css | 700 | 0 | 118 |
| src/assets/css/search.css | 414 | 0 | 82 |
| src/assets/css/studio.css | 245 | 0 | 42 |
| src/assets/css/style.css | 14865 | 10 | 2427 |
| src/assets/css/survey.css | 896 | 0 | 126 |
- Data comes from mixed sources: Supabase REST, Supabase client-side JS, Sanity fetches, static JSON, and local generated data helpers.
- Content/data boundaries are implicit in data loader files and page templates; rebuild needs explicit model contracts.
- Build currently tolerates missing/failed Supabase/Sanity data with warnings in several loaders; rebuild should define fallback behavior intentionally.
3
11
73
7
2
9
19
8
35
96
- The current site is an Eleventy/Nunjucks application with static generation and a substantial amount of client-side Supabase workflow code embedded directly in templates.
- The public site is broad: directories, resources, reports, guides, blog/editorial, concepts/topics, academy, careers, events, people, vendor profiles, persona pages, assessments, and legal/simple pages.
- Authenticated areas already exist but are uneven: B2BEA Admin is the most functional app surface; member dashboard/profile and vendor portal exist but are thinner; practitioner company workspace is not currently represented as its own surface.
- Design drift is structural: one large legacy stylesheet, multiple surface stylesheets, page inline styles, client-side scripts in templates, and a newer Lovable normalization layer layered over older CSS.
- The rebuild should not start from page visuals. It should start from surfaces, capabilities, content/data contracts, design-system primitives, and reusable template families.
3
2
2
6
2
7
4
12
2
3
2
3
- Item
- file: src/account/index.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/admin/academy/course.njk - family: admin_academy - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/admin/academy/index.njk - family: admin_academy - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/admin/academy/lesson.njk - family: admin_academy - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/admin/categories/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: true - inline script: true - Item
- file: src/admin/companies/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/admin/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/admin/jobs/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: true - inline script: true - Item
- file: src/admin/users/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/admin/vendors/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true - Item
- file: src/agencies/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/assessments/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/assessments/maturity/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: true - inline script: true - Item
- file: src/assessments/maturity/results/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: true - inline script: true - Item
- file: src/assessments/maturity/take/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/authors/author.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/blog/index.njk - family: editorial_blog - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/blog/post.njk - family: editorial_blog - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/careers/index.njk - family: careers_jobs - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/careers/job.njk - family: careers_jobs - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/case-studies/case-study.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/case-studies/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/concepts/ai-product-recommendations-b2b.njk - family: concept_library - layout: editorial.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/concepts/concept.njk - family: concept_library - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/concepts/index.njk - family: concept_library - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/confirm-email/index.njk - family: auth - layout: auth.njk - surface: auth - inline style: false - inline script: true - Item
- file: src/consultants/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/courses/course.njk - family: academy - layout - surface: public_site - inline style: true - inline script: true - Item
- file: src/courses/index.njk - family: academy - layout - surface: public_site - inline style: false - inline script: true - Item
- file: src/courses/lessons/lesson.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/courses/modules/challenge-feedback.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/courses/modules/challenge.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/courses/modules/test.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/dashboard/index.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/dashboard/onboarding/index.njk - family: member_account_profile - layout: base.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/dashboard/profile/edit.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/dashboard/profile/knowledge.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/dashboard/profile.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/dashboard/welcome/index.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true - Item
- file: src/distributors/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/events/event.njk - family: events - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/events/index.njk - family: events - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/exchange/exchange.njk - family: vendor_directory - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/exchange/index.njk - family: vendor_directory - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/exchange/vendor-claim.njk - family: vendor_portal_claims - layout: base.njk - surface: vendor_management_portal - inline style: false - inline script: true - Item
- file: src/for/agencies/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/for/consultants/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/for/distributors/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/for/manufacturers/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/for/software-providers/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/for/vendors/index.njk - family: vendor_directory - layout: base.njk - surface: public_site - inline style: true - inline script: true - Item
- file: src/guides/guide.njk - family: guides - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/guides/index.njk - family: guides - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/how-we-use-ai/index.njk - family: public_core - layout: false - surface: public_site - inline style: false - inline script: false - Item
- file: src/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/insights/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: true - Item
- file: src/leaders/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: false - Item
- file: src/login/index.njk - family: auth - layout: auth.njk - surface: auth - inline style: false - inline script: true - Item
- file: src/manufacturers/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false - Item
- file: src/pages/about.njk - family: simple_marketing_legal - layout: base.njk - surface: public_site - inline style: false - inline script: false
| reason | artifact type |
|---|---|
| Organize current and target capabilities by surface/area after reverse engineering. | capability-map |
| Define hardened shared foundation before any new page coding. | design-system-spec |
| Define public, admin, member, vendor, and practitioner company workspaces separately. | surface-spec |
| Turn implicit data loaders/tables into explicit model contracts. | content-model-spec |
| Map all routes/page families to reusable templates and components. | page-template-spec |
| Capture data warnings, legacy CSS risk, auth/permission gaps, and migration hazards. | risk-register |
| area | signals | evidence |
|---|---|---|
| auth | - SignInWithPassword - SignInWithOAuth - SignInWithOtp - ResetPasswordForEmail - SignUp - UpdateEmail - ChangePassword - LinkIdentity - UnlinkIdentity - SignOut | - src/login/index.njk - src/signup/index.njk - src/account/index.njk |
| member_profile | - UpdateProfileName - UpdateHeadshot - UpdateProfileFields - CompleteProfile - ManageKnowledgeProfile | - src/dashboard/index.njk - src/dashboard/profile/edit.njk - src/account/index.njk |
| academy_admin | - CreateCourse - UpdateCourse - DeleteCourse - SetCourseInstructor - UpdateCoursePricing - UpdateCourseThumbnail - CreateModule - UpdateModule - DeleteModule - CreateLesson - UpdateLesson - DeleteLesson - EnrollLearner - UnenrollLearner | - src/admin/academy/index.njk - src/admin/academy/course.njk - src/admin/academy/lesson.njk |
| academy_learner | - CheckEnrollment - StartLesson - SaveLessonProgress - CompleteLesson - UpdateModuleProgress - TakeKnowledgeCheck - SubmitApplicationChallenge | - src/courses/lessons/lesson.njk - src/courses/modules/challenge.njk - src/courses/modules/test.njk |
| vendor_admin | - CreateVendor - UpdateVendor - AssignVendorCategories - ApproveVendorClaim - AssignVendorAdmin - ReviewVendorContentSubmission | - src/admin/vendors/index.njk |
| vendor_portal | - SubmitVendorProfileUpdate - VendorCreateCaseStudyDraft - VendorSubmitExistingCaseStudy - VendorCreateBlogPostDraft - VendorSubmitExistingBlogPost - ViewVendorAnalytics - ClaimVendorListing | - src/vendor-portal/index.njk - src/exchange/vendor-claim.njk |
| jobs_admin | - CreateScrapeSource - UpdateScrapeSource - RunScrapeSource - DeleteScrapeSource - ReviewScrapedJob - ApproveScrapedJob - RejectScrapedJob - CreateJob - UpdateJob - PublishOrArchiveJob | - src/admin/jobs/index.njk |
| taxonomy_admin | - UpdateSubcategory - CreateCategoryFaq - UpdateCategoryFaq - DeleteCategoryFaq - AssignCategoryExpert - RemoveCategoryExpert | - src/admin/categories/index.njk |
| users_admin | - CreateUserPerson - UpdateUserPerson - AssignRoles - RemoveRoles - GrantPlatformAdmin - RevokePlatformAdmin - AssignOrganization | - src/admin/users/index.njk |
| resources_gating | - GateResourceByAccount - GateResourceByProMembership - RecordResourceDownload | - src/guides/guide.njk - src/reports/report.njk - src/resources/*/index.njk |
| analytics | - RecordPageView - AggregateVendorProfileViews - AggregateVendorContentViews | - src/blog/post.njk - src/case-studies/case-study.njk - src/exchange/exchange.njk - src/vendors/orocommerce.njk - src/vendor-portal/index.njk |
| assessments | - CreateAssessmentSession - LoadAssessmentResults | - src/assessments/maturity/take/index.njk - src/assessments/maturity/results/index.njk |
| op | count |
|---|---|
| resource_downloads.upsert | 5 |
| people.update | 4 |
| page_views.insert | 4 |
| organizations.select | 3 |
| lessons.delete | 2 |
| persons.select | 2 |
| courses.update | 2 |
| subcategories.select | 2 |
| people.select | 2 |
| vendors.select | 2 |
| person_roles.insert | 2 |
| modules.update | 1 |
| modules.delete | 1 |
| modules.insert | 1 |
| lessons.insert | 1 |
| course_enrollments.delete | 1 |
| course_enrollments.insert | 1 |
| courses.insert | 1 |
| courses.delete | 1 |
| lessons.update | 1 |
| subcategories.update | 1 |
| category_faqs.delete | 1 |
| category_faqs.update | 1 |
| category_faqs.insert | 1 |
| category_experts.delete | 1 |
| category_experts.insert | 1 |
| vendor_updates.select | 1 |
| scrape_sources.select | 1 |
| scrape_sources.update | 1 |
| scrape_runs.insert | 1 |
| scrape_sources.delete | 1 |
| scrape_sources.insert | 1 |
| scraped_jobs.select | 1 |
| jobs.insert | 1 |
| scraped_jobs.update | 1 |
| jobs.update | 1 |
| persons.update | 1 |
| person_roles.delete | 1 |
| platform_admins.delete | 1 |
| persons.insert | 1 |
| vendors.update | 1 |
| organizations.insert | 1 |
| vendors.insert | 1 |
| vendor_category_assignments.delete | 1 |
| vendor_category_assignments.insert | 1 |
| vendor_updates.update | 1 |
| vendor_content_submissions.update | 1 |
| vendor_content_submissions.select | 1 |
| assessment_sessions.select | 1 |
| assessment_sessions.insert | 1 |
| vendor_content_submissions.insert | 1 |
| vendor_updates.insert | 1 |
- The current repo uses file-based Eleventy/Nunjucks templates, with dynamic route generation via permalink strings for blogs, vendors, people, guides, reports, events, careers, concepts, and courses.
- Several pages are full templates with inline scripts and styles rather than thin views composed from shared components.
- The same broad design pattern appears in multiple persona pages; rebuild should collapse these into one persona landing template with content data.
- Admin pages are large single-file app screens; rebuild should split them into capability/workflow specs before choosing component boundaries.