Skip to content

chore: strip marketing content for public core repo#108

Merged
JoachimLK merged 4 commits intomainfrom
chore/separate-marketing-layer
Mar 13, 2026
Merged

chore: strip marketing content for public core repo#108
JoachimLK merged 4 commits intomainfrom
chore/separate-marketing-layer

Conversation

@JoachimLK
Copy link
Copy Markdown
Contributor

@JoachimLK JoachimLK commented Mar 13, 2026

Remove blog, docs, catalog, roadmap pages and content. Remove @nuxt/content, @nuxtjs/seo, @nuxtjs/mdc, @tailwindcss/typography deps. Replace useSchemaOrg with manual JSON-LD in job detail page. Simplify PublicNavBar for self-hosters. Add redirect index.vue (marketing layer overrides this).

Summary

  • What does this PR change?
  • Why is this needed?

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Docs
  • Chore

Validation

  • I tested locally
  • I added/updated relevant documentation
  • I verified multi-tenant scoping and auth behavior for affected API paths

DCO

  • All commits in this PR are signed off (Signed-off-by) via git commit -s

Summary by CodeRabbit

  • Refactor

    • Removed large swath of public content: blog articles, docs, roadmap, feature catalog, and many product/feature pages.
    • Simplified home page and main navigation — removed links to Blog, Docs, Catalog, and Roadmap; streamlined landing content and CTAs.
    • Removed client-side discussion widget and dynamic sitemap generation.
  • Chores

    • Removed site-level SEO/content tooling and related prerender rules.
    • Deleted multiple content/configuration files and related dependencies.

Remove blog, docs, catalog, roadmap pages and content.
Remove @nuxt/content, @nuxtjs/seo, @nuxtjs/mdc, @tailwindcss/typography deps.
Replace useSchemaOrg with manual JSON-LD in job detail page.
Simplify PublicNavBar for self-hosters.
Add redirect index.vue (marketing layer overrides this).
@railway-app railway-app Bot temporarily deployed to applirank / reqcore-pr-108 March 13, 2026 08:17 Destroyed
@railway-app
Copy link
Copy Markdown

railway-app Bot commented Mar 13, 2026

🚅 Deployed to the reqcore-pr-108 environment in applirank

Service Status Web Updated (UTC)
applirank ✅ Success (View Logs) Mar 13, 2026 at 9:01 am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 13, 2026

Warning

Rate limit exceeded

@JoachimLK has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 18 minutes and 24 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6ca33b91-a6ff-42b5-9e5e-d31ee8fbdcb7

📥 Commits

Reviewing files that changed from the base of the PR and between 5eb338d and 02ce615.

📒 Files selected for processing (1)
  • .github/workflows/docker-readme-validation.yml
📝 Walkthrough

Walkthrough

This PR removes a large portion of the public site and content: many docs, blog posts, catalog/spec pages, topical/SEO artifacts, dynamic sitemap, Nuxt Content/SEO integrations, several page components (blog, docs, catalog, roadmap), the Giscus widget, and related Nuxt configuration—leaving a minimal, auth-focused landing.

Changes

Cohort / File(s) Summary
Landing & Public Pages
app/pages/index.vue, app/pages/roadmap.vue, app/pages/catalog/index.vue
Replaced index with a minimal auth-aware landing; removed roadmap and catalog page components and their UI/logic.
Blog routes & content
app/pages/blog/index.vue, app/pages/blog/[...slug].vue, content/blog/*
Deleted blog index, dynamic blog route, and all blog post markdown files.
Docs routes & content
app/pages/docs/index.vue, app/pages/docs/[...slug].vue, content/docs/*
Removed docs index, dynamic docs page, and entire docs tree (getting-started, deployment, features, architecture, contributing, legal).
Feature catalog & specs
content/catalog/*
Deleted the full feature catalog and all individual feature/spec markdown pages (AI, applicant management, collaboration, pipeline, platform, security, mobile, recruitment tools).
Topical authority & SEO research
TOPICAL-AUTHORITY-MAP.md, seo-research/*
Removed topical authority map and SEO research/topic briefs.
UI components & navbar
app/components/GiscusComments.vue, app/components/PublicNavBar.vue
Removed Giscus comments component and pruned center navigation links (Features, Roadmap, Blog, Docs).
Content config & Nuxt integration
content.config.ts, nuxt.config.ts, package.json
Removed Nuxt Content config and site/SEO blocks; dropped @nuxt/content and @nuxtjs/seo from config and package.json; removed giscus runtime fields and many prerender route rules.
Sitemap API
server/api/__sitemap__/urls.ts
Deleted dynamic sitemap generator that produced job & blog URLs.
Docker image
Dockerfile
Stopped copying the Nuxt Content .data SQLite file into final image (removes .data COPY).
Other removed content
many content/... markdown files
Mass deletion of marketing, how‑to, comparison, and product-spec markdown across content/, content/blog/, content/catalog/, content/docs/.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐇 I hopped through folders, nibbling old prose,

Cleared dusty trails where long doc-lanterns doze.
Links tucked away, the navbar breathes light,
A smaller burrow now, ready for night flight.
✨ Hooray — a tidy warren for future bytes.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description template is present with sections for Summary, Type of change, Validation, and DCO, but the author has not completed the required Summary section or marked the validation checkboxes. Complete the Summary section with what changed and why it's needed. Mark relevant Type of change and Validation checkboxes, and confirm DCO sign-off.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main objective: stripping marketing content from the public core repository.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/separate-marketing-layer
📝 Coding Plan
  • Generate coding plan for human review comments

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.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/pages/jobs/`[slug]/index.vue:
- Around line 147-158: The JSON-LD script injected via useHead is missing a
deduplication key, so repeated watchEffect runs append duplicate <script
type="application/ld+json"> tags; update the script entry passed to useHead (the
object in the script array where innerHTML: JSON.stringify({ '@context':
'https://schema.org', ...posting })) to include a unique key (e.g., use
posting.id or a fixed 'job-jsonld' key) so Nuxt can dedupe, or alternatively
compute the JSON-LD in a computed ref and call useHead once at top-level in the
<script setup>.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 06f86bd3-80d1-4b48-9649-afe8a832f7d9

📥 Commits

Reviewing files that changed from the base of the PR and between 303d0bd and 88c9161.

📒 Files selected for processing (82)
  • TOPICAL-AUTHORITY-MAP.md
  • app/components/GiscusComments.vue
  • app/components/PublicNavBar.vue
  • app/pages/blog/[...slug].vue
  • app/pages/blog/index.vue
  • app/pages/catalog/index.vue
  • app/pages/docs/[...slug].vue
  • app/pages/docs/index.vue
  • app/pages/index.vue
  • app/pages/jobs/[slug]/index.vue
  • app/pages/roadmap.vue
  • content.config.ts
  • content/blog/best-free-ats-software-for-startups.md
  • content/blog/best-open-source-applicant-tracking-systems.md
  • content/blog/career-page-seo.md
  • content/blog/career-page-that-converts.md
  • content/blog/google-for-jobs-structured-data.md
  • content/blog/greenhouse-vs-open-source-ats.md
  • content/blog/how-applicant-tracking-systems-work.md
  • content/blog/open-source-applicant-tracking-system.md
  • content/blog/open-source-vs-free-ats.md
  • content/blog/opencats-vs-reqcore.md
  • content/blog/self-hosted-vs-cloud-ats.md
  • content/blog/total-cost-of-ownership-saas-ats-vs-self-hosted.md
  • content/blog/who-uses-open-source-ats.md
  • content/catalog/ai-intelligence/ai-ranking/index.md
  • content/catalog/ai-intelligence/index.md
  • content/catalog/ai-intelligence/local-ai/index.md
  • content/catalog/ai-intelligence/resume-parsing/index.md
  • content/catalog/applicant-management/email-communication/index.md
  • content/catalog/applicant-management/index.md
  • content/catalog/applicant-management/phone-communication/index.md
  • content/catalog/collaboration/candidate-portal/index.md
  • content/catalog/collaboration/email-notifications/index.md
  • content/catalog/collaboration/index.md
  • content/catalog/collaboration/interview-scheduling/index.md
  • content/catalog/collaboration/team-comments/index.md
  • content/catalog/mobile-support/index.md
  • content/catalog/mobile-support/responsive-dashboard/index.md
  • content/catalog/pipeline-management/application-tracking/index.md
  • content/catalog/pipeline-management/candidate-profiles/index.md
  • content/catalog/pipeline-management/index.md
  • content/catalog/pipeline-management/job-management/index.md
  • content/catalog/pipeline-management/kanban-board/index.md
  • content/catalog/platform/dashboard/index.md
  • content/catalog/platform/deployment/index.md
  • content/catalog/platform/index.md
  • content/catalog/platform/multi-tenant/index.md
  • content/catalog/recruitment-tools/custom-application-forms/index.md
  • content/catalog/recruitment-tools/document-storage/index.md
  • content/catalog/recruitment-tools/index.md
  • content/catalog/recruitment-tools/public-job-board/index.md
  • content/catalog/security-compliance/gdpr/index.md
  • content/catalog/security-compliance/index.md
  • content/catalog/security-compliance/rate-limiting/index.md
  • content/catalog/security-compliance/server-proxied-documents/index.md
  • content/docs/1.getting-started/1.introduction.md
  • content/docs/1.getting-started/2.installation.md
  • content/docs/1.getting-started/3.configuration.md
  • content/docs/1.getting-started/4.quick-start.md
  • content/docs/2.deployment/1.docker-compose.md
  • content/docs/2.deployment/2.railway.md
  • content/docs/2.deployment/3.environment-variables.md
  • content/docs/3.features/1.job-management.md
  • content/docs/3.features/2.candidate-pipeline.md
  • content/docs/3.features/3.document-storage.md
  • content/docs/3.features/4.public-job-board.md
  • content/docs/3.features/5.application-forms.md
  • content/docs/3.features/6.dashboard.md
  • content/docs/3.features/7.google-calendar.md
  • content/docs/4.architecture/1.overview.md
  • content/docs/4.architecture/2.directory-structure.md
  • content/docs/4.architecture/3.data-model.md
  • content/docs/4.architecture/4.security.md
  • content/docs/5.contributing/1.development-setup.md
  • content/docs/5.contributing/2.coding-conventions.md
  • content/docs/6.legal/1.privacy-policy.md
  • nuxt.config.ts
  • package.json
  • seo-research/source-package-opencats-vs-reqcore.md
  • seo-research/topic-brief-opencats-vs-reqcore.md
  • server/api/__sitemap__/urls.ts
💤 Files with no reviewable changes (79)
  • content/catalog/platform/multi-tenant/index.md
  • content/catalog/security-compliance/rate-limiting/index.md
  • content/catalog/recruitment-tools/index.md
  • content/docs/3.features/1.job-management.md
  • content/blog/career-page-seo.md
  • content/catalog/pipeline-management/job-management/index.md
  • app/pages/blog/[...slug].vue
  • content/docs/4.architecture/2.directory-structure.md
  • app/components/PublicNavBar.vue
  • content/docs/4.architecture/3.data-model.md
  • content/docs/1.getting-started/3.configuration.md
  • content/catalog/security-compliance/gdpr/index.md
  • content/docs/3.features/7.google-calendar.md
  • content/catalog/collaboration/team-comments/index.md
  • content/catalog/security-compliance/index.md
  • content/blog/opencats-vs-reqcore.md
  • content/docs/5.contributing/2.coding-conventions.md
  • TOPICAL-AUTHORITY-MAP.md
  • content/docs/2.deployment/3.environment-variables.md
  • content/catalog/pipeline-management/kanban-board/index.md
  • content/docs/2.deployment/2.railway.md
  • content.config.ts
  • content/blog/who-uses-open-source-ats.md
  • content/catalog/collaboration/email-notifications/index.md
  • content/blog/how-applicant-tracking-systems-work.md
  • content/docs/3.features/6.dashboard.md
  • content/catalog/collaboration/interview-scheduling/index.md
  • content/catalog/platform/index.md
  • content/blog/career-page-that-converts.md
  • content/docs/5.contributing/1.development-setup.md
  • content/catalog/ai-intelligence/local-ai/index.md
  • content/docs/6.legal/1.privacy-policy.md
  • content/catalog/recruitment-tools/document-storage/index.md
  • content/blog/greenhouse-vs-open-source-ats.md
  • content/catalog/pipeline-management/candidate-profiles/index.md
  • content/docs/3.features/2.candidate-pipeline.md
  • content/docs/3.features/5.application-forms.md
  • content/docs/1.getting-started/1.introduction.md
  • content/catalog/security-compliance/server-proxied-documents/index.md
  • content/blog/best-open-source-applicant-tracking-systems.md
  • content/docs/3.features/3.document-storage.md
  • content/catalog/collaboration/candidate-portal/index.md
  • content/catalog/ai-intelligence/index.md
  • app/pages/blog/index.vue
  • content/catalog/ai-intelligence/ai-ranking/index.md
  • content/catalog/recruitment-tools/public-job-board/index.md
  • server/api/sitemap/urls.ts
  • content/docs/4.architecture/4.security.md
  • seo-research/topic-brief-opencats-vs-reqcore.md
  • content/catalog/collaboration/index.md
  • content/catalog/applicant-management/phone-communication/index.md
  • content/docs/1.getting-started/2.installation.md
  • content/catalog/pipeline-management/index.md
  • content/catalog/mobile-support/index.md
  • package.json
  • content/catalog/applicant-management/index.md
  • content/docs/3.features/4.public-job-board.md
  • content/catalog/applicant-management/email-communication/index.md
  • content/docs/1.getting-started/4.quick-start.md
  • content/catalog/recruitment-tools/custom-application-forms/index.md
  • app/pages/roadmap.vue
  • content/blog/open-source-vs-free-ats.md
  • content/catalog/platform/dashboard/index.md
  • content/blog/self-hosted-vs-cloud-ats.md
  • content/catalog/mobile-support/responsive-dashboard/index.md
  • content/blog/open-source-applicant-tracking-system.md
  • app/pages/docs/index.vue
  • content/catalog/platform/deployment/index.md
  • content/docs/2.deployment/1.docker-compose.md
  • content/blog/google-for-jobs-structured-data.md
  • seo-research/source-package-opencats-vs-reqcore.md
  • content/catalog/pipeline-management/application-tracking/index.md
  • app/pages/catalog/index.vue
  • content/blog/best-free-ats-software-for-startups.md
  • content/catalog/ai-intelligence/resume-parsing/index.md
  • content/docs/4.architecture/1.overview.md
  • content/blog/total-cost-of-ownership-saas-ats-vs-self-hosted.md
  • app/components/GiscusComments.vue
  • app/pages/docs/[...slug].vue

Comment on lines +147 to +158
// Inject JSON-LD as a <script> tag (works without @nuxtjs/seo)
useHead({
script: [
{
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
...posting,
}),
},
],
})
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

Nuxt 4 useHead script key deduplication

💡 Result:

In Nuxt 4, useHead() is powered by Unhead, and script deduplication is controlled via a key you set on each tag.

  • If the same key appears again in a later useHead() call, Unhead will dedupe by replacing the earlier tag with the new one (so you don’t end up with duplicates). [1]
  • Nuxt’s useHead supports script: Script[] where each object becomes a <script> tag (so you can add key alongside src, async, etc.). [2]

Example (dedupe across components/layouts/pages):

useHead({
  script: [
    { key: 'stripe-js', src: 'https://js.stripe.com/v3/', async: true }
  ]
})

If you’re using Nuxt “head components” (e.g., <Head>, <Script>) rather than useHead, note Nuxt 4.3 included a fix for deduplication using the key attribute. [3]

Sources: Unhead tag deduplication docs [1], Nuxt 4 useHead docs [2], Nuxt 4.3 release notes [3].


🏁 Script executed:

cat -n app/pages/jobs/[slug]/index.vue | sed -n '130,170p'

Repository: reqcore-inc/reqcore

Length of output: 1250


🏁 Script executed:

cat -n app/pages/jobs/[slug]/index.vue | sed -n '110,159p'

Repository: reqcore-inc/reqcore

Length of output: 1592


🏁 Script executed:

cat -n app/pages/jobs/[slug]/index.vue | sed -n '70,115p'

Repository: reqcore-inc/reqcore

Length of output: 1480


Add a key to dedupe the JSON-LD script tag.

Calling useHead inside watchEffect without a deduplication key can cause multiple <script type="application/ld+json"> tags to accumulate when the effect re-runs. Nuxt dedupes head entries by key, so without one each invocation appends a new script.

♻️ Proposed fix: add a key for deduplication
   useHead({
     script: [
       {
+        key: 'job-posting-jsonld',
         type: 'application/ld+json',
         innerHTML: JSON.stringify({
           '@context': 'https://schema.org',
           ...posting,
         }),
       },
     ],
   })

Alternatively, move the JSON-LD to a computed ref and call useHead once at the top level of <script setup> with the reactive value—this is the more idiomatic Nuxt pattern.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Inject JSON-LD as a <script> tag (works without @nuxtjs/seo)
useHead({
script: [
{
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
...posting,
}),
},
],
})
// Inject JSON-LD as a <script> tag (works without `@nuxtjs/seo`)
useHead({
script: [
{
key: 'job-posting-jsonld',
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
...posting,
}),
},
],
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/pages/jobs/`[slug]/index.vue around lines 147 - 158, The JSON-LD script
injected via useHead is missing a deduplication key, so repeated watchEffect
runs append duplicate <script type="application/ld+json"> tags; update the
script entry passed to useHead (the object in the script array where innerHTML:
JSON.stringify({ '@context': 'https://schema.org', ...posting })) to include a
unique key (e.g., use posting.id or a fixed 'job-jsonld' key) so Nuxt can
dedupe, or alternatively compute the JSON-LD in a computed ref and call useHead
once at top-level in the <script setup>.

- Added @nuxtjs/mdc version 0.20.1
- Added @tailwindcss/typography version 0.5.19
@railway-app railway-app Bot temporarily deployed to applirank / reqcore-pr-108 March 13, 2026 08:35 Destroyed
@railway-app railway-app Bot temporarily deployed to applirank / reqcore-pr-108 March 13, 2026 08:44 Destroyed
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
app/pages/index.vue (2)

4-5: Avoid reading the same session in both the page and the navbar.

Line 5 and app/components/PublicNavBar.vue:1-79 both fetch the session to drive adjacent CTAs. Passing the page-level session into PublicNavBar (or lifting both consumers onto one shared composable) keeps auth state single-owned and avoids split fetch/render logic on /.

Also applies to: 25-25

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/pages/index.vue` around lines 4 - 5, The page currently calls
authClient.useSession() to get the session while PublicNavBar.vue also
independently fetches the session, causing duplicated reads and split state;
refactor so the page (where const { data: session } = await
authClient.useSession(useFetch) is used) owns the session and pass that session
into PublicNavBar as a prop (or alternatively extract a shared composable that
both consume) and remove the redundant authClient.useSession call from
PublicNavBar.vue so both CTAs use the single source of truth.

70-80: Use list markup for the pillar cards.

This is a three-item feature list. Switching the wrapper/items to <ul>/<li> keeps the layout the same and gives screen readers proper grouping and item counts.

♿ Minimal semantic tweak
-      <div class="hero-animate hero-delay-4 mx-auto mt-28 grid max-w-3xl gap-4 sm:grid-cols-3">
-        <div
+      <ul class="hero-animate hero-delay-4 mx-auto mt-28 grid max-w-3xl gap-4 sm:grid-cols-3">
+        <li
           v-for="pillar in pillars"
           :key="pillar.label"
           class="bento-card relative rounded-xl p-6"
         >
           <component :is="pillar.icon" class="mb-4 h-5 w-5 text-brand-400" />
           <h2 class="text-[15px] font-semibold text-white">{{ pillar.label }}</h2>
           <p class="mt-1.5 text-[13px] leading-relaxed text-surface-400">{{ pillar.desc }}</p>
-        </div>
-      </div>
+        </li>
+      </ul>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/pages/index.vue` around lines 70 - 80, The pillar cards are rendered as
plain divs but should be semantic list items; change the outer container element
that currently uses <div class="hero-animate ..."> to a <ul> while keeping the
same classes, and change each repeated <div v-for="pillar in pillars"
:key="pillar.label" class="bento-card ..."> to an <li> with the same classes and
the v-for/:key moved to the <li>, keeping the <component :is="pillar.icon" ...
/>, <h2>{{ pillar.label }}</h2>, and <p>{{ pillar.desc }}</p> intact so the
visual layout and classes (hero-animate, bento-card, etc.) are preserved while
providing proper semantic grouping for the pillars array.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@app/pages/index.vue`:
- Around line 4-5: The page currently calls authClient.useSession() to get the
session while PublicNavBar.vue also independently fetches the session, causing
duplicated reads and split state; refactor so the page (where const { data:
session } = await authClient.useSession(useFetch) is used) owns the session and
pass that session into PublicNavBar as a prop (or alternatively extract a shared
composable that both consume) and remove the redundant authClient.useSession
call from PublicNavBar.vue so both CTAs use the single source of truth.
- Around line 70-80: The pillar cards are rendered as plain divs but should be
semantic list items; change the outer container element that currently uses <div
class="hero-animate ..."> to a <ul> while keeping the same classes, and change
each repeated <div v-for="pillar in pillars" :key="pillar.label"
class="bento-card ..."> to an <li> with the same classes and the v-for/:key
moved to the <li>, keeping the <component :is="pillar.icon" ... />, <h2>{{
pillar.label }}</h2>, and <p>{{ pillar.desc }}</p> intact so the visual layout
and classes (hero-animate, bento-card, etc.) are preserved while providing
proper semantic grouping for the pillars array.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ff8dd862-afc4-4265-b9c9-150522ae80e0

📥 Commits

Reviewing files that changed from the base of the PR and between 88c9161 and ad922d8.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (3)
  • app/pages/index.vue
  • nuxt.config.ts
  • package.json
💤 Files with no reviewable changes (1)
  • package.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • nuxt.config.ts

@railway-app railway-app Bot temporarily deployed to applirank / reqcore-pr-108 March 13, 2026 08:58 Destroyed
@JoachimLK JoachimLK merged commit ac79c19 into main Mar 13, 2026
5 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