Skip to content

fix(seo): site-wide SEO audit — canonical consistency, titles & structured data#1599

Open
popovayoana wants to merge 1 commit into
mainfrom
fix/seo-audit-2026
Open

fix(seo): site-wide SEO audit — canonical consistency, titles & structured data#1599
popovayoana wants to merge 1 commit into
mainfrom
fix/seo-audit-2026

Conversation

@popovayoana

@popovayoana popovayoana commented Jun 18, 2026

Copy link
Copy Markdown
Member

Summary

Site-wide SEO audit addressing canonical fragmentation, duplicate meta injection, stale structured data, and missing SEO on several pages. No UI or logic changes — purely meta/SEO layer.

What was broken

  • Wrong canonical domains: 2 pages used portaljs.org (not the real domain), 18 pages used non-www portaljs.com while structured data components used www.portaljs.com — Google sees these as different URLs
  • Duplicate SEO injection: case-studies.tsx, data-portals.tsx, and faq.tsx each had both an inline generateNextSeo AND a structured data component injecting conflicting canonicals into the same page
  • Stale structured data: CaseStudiesStructuredData and DataPortalStructuredData both pointed to /showcase (URL no longer exists), with placeholder-quality titles ("See our client stories.")
  • Missing SEO entirely: features.tsx and solutions/open-data.tsx had no title/description/canonical at all; solutions/open-data.tsx was using HomePageStructuredData (homepage canonical on a different page)
  • Thin titles: "FAQ", "Blog", "Pricing", "Showcase of Case Studies" — bare words that waste title tag real estate
  • Global defaults: Twitter handle @datopian (not the product handle), no og:site_name, non-www OG image URL

Changes

Area What changed
next-sitemap.config.js Base URL → https://www.portaljs.com
content/config.js Twitter @datopian@PortalJS_; add og:site_name; fix OG image URL
CaseStudiesStructuredData Fix /showcase/case-studies; proper title + description
DataPortalStructuredData Fix /showcase/data-portals; proper title + description
BlogStructuredData, FaqStructuredData, HomePageStructuredData Fix OG image URLs; improve titles
case-studies.tsx, data-portals.tsx, faq.tsx Remove duplicate inline generateNextSeo (schema components handle it)
features.tsx Add full SEO block (was completely missing)
solutions/open-data.tsx Replace HomePageStructuredData with page-specific SEO + correct breadcrumb
opensource.tsx Fix portaljs.orgwww.portaljs.com; add canonical + full OG
16× pages (compare/*, git, ckan, openmetadata, purview, datahub, partners, learn/*) Non-www → www on all canonical, OG url, and OrganizationJsonLd urls

No conflicts with open PRs

Test plan

  • Build passes (next build)
  • Verify no duplicate <link rel="canonical"> tags appear on /case-studies, /data-portals, /faq
  • Check Google Rich Results Test on homepage, /case-studies, /faq for valid structured data
  • Confirm /solutions/open-data canonical is https://www.portaljs.com/solutions/open-data (not the homepage)
  • Confirm /features now has a title tag and canonical
  • Spot-check Twitter card meta shows @PortalJS_ not @datopian

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • SEO Enhancements
    • Standardized domain to www.portaljs.com across the platform
    • Updated page metadata, titles, and descriptions for improved search discoverability
    • Enhanced Open Graph and Twitter card information for social sharing
    • Refined structured data for comparison pages, features, and pricing documentation

@changeset-bot

changeset-bot Bot commented Jun 18, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: b0fc081

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
www.portaljs.com Ready Ready Preview, Comment Jun 18, 2026 4:43pm
7 Skipped Deployments
Project Deployment Actions Updated (UTC)
portaljs-alan-turing Ignored Ignored Preview Jun 18, 2026 4:43pm
portaljs-ckan Ignored Ignored Preview Jun 18, 2026 4:43pm
portaljs-ckan-ssg Ignored Ignored Preview Jun 18, 2026 4:43pm
portaljs-fivethirtyeight Ignored Ignored Preview Jun 18, 2026 4:43pm
portaljs-git-example Ignored Ignored Preview Jun 18, 2026 4:43pm
portaljs-learn Ignored Ignored Preview Jun 18, 2026 4:43pm
portaljs-openspending Ignored Ignored Preview Jun 18, 2026 4:43pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Migrates all hardcoded SEO and structured-data URLs from portaljs.com to www.portaljs.com across pages and schema components. Updates schema component metadata copy and breadcrumb labels (e.g., "Showcase" → "Case Studies", "Data Portals"). Removes duplicate page-level <Head> SEO blocks from case-studies, data-portals, and faq pages, and adds new full SEO metadata to features, pricing, opensource, and solutions/open-data pages.

Changes

SEO Domain Migration, Schema Updates, and New Page SEO

Layer / File(s) Summary
Global SEO config and sitemap baseline
site/content/config.js, site/next-sitemap.config.js
Adds openGraph.site_name, updates OG image URL/alt and Twitter handle/site to @PortalJS_ in the global config; changes the sitemap fallback siteUrl to https://www.portaljs.com.
Schema component SEO metadata and breadcrumb updates
site/components/schema/BlogStructuredData.tsx, site/components/schema/CaseStudiesStructuredData.tsx, site/components/schema/DataPortalStructuredData.tsx, site/components/schema/FaqStructuredData.tsx, site/components/schema/HomePageStructuredData.tsx
Updates generateNextSeo title/description/canonical/OG/Twitter and BreadcrumbJsonLd entries across all schema components; renames "Showcase" breadcrumbs to "Case Studies" and "Data Portals" with matching canonical paths.
Page SEO consolidation: remove duplicate Head blocks
site/pages/case-studies.tsx, site/pages/data-portals.tsx, site/pages/faq.tsx
Removes generateNextSeo/Head imports and inline <Head> SEO blocks from these pages, delegating SEO metadata entirely to their corresponding structured data components.
New SEO additions: features, pricing, opensource, open-data
site/pages/features.tsx, site/pages/pricing.tsx, site/pages/opensource.tsx, site/pages/solutions/open-data.tsx
Adds full generateNextSeo metadata blocks (title, description, canonical, OG, Twitter) to features and pricing pages; overhauls opensource SEO and OrganizationJsonLd from portaljs.org to www.portaljs.com; replaces HomePageStructuredData on solutions/open-data with explicit OrganizationJsonLd, BreadcrumbJsonLd, and a full SEO head.
Domain migration across integration and compare pages
site/pages/ckan.tsx, site/pages/datahub.tsx, site/pages/git.tsx, site/pages/learn/..., site/pages/openmetadata.tsx, site/pages/partners.tsx, site/pages/purview.tsx, site/pages/compare/*
Replaces all https://portaljs.com references with https://www.portaljs.com in OrganizationJsonLd, generateNextSeo canonical/OG URL, OG image URL, and BreadcrumbJsonLd item URLs across all integration and compare pages.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~15 minutes

Possibly related PRs

  • datopian/portaljs#1386: This PR directly edits the same structured-data components introduced in PR #1386—updating generateNextSeo/OpenGraph fields and breadcrumb entries inside BlogStructuredData, CaseStudiesStructuredData, DataPortalStructuredData, FaqStructuredData, and HomePageStructuredData.
  • datopian/portaljs#1528: This PR's edits to generateNextSeo metadata and breadcrumb entries inside the same structured-data components directly build on the next-seo v7 refactor performed in PR #1528.
  • datopian/portaljs#1401: Both PRs modify the case studies/data portals implementation and SEO/structured-data for those routes (site/pages/case-studies.tsx, site/pages/data-portals.tsx, and the corresponding *StructuredData.tsx components).

Suggested reviewers

  • anuveyatsu
  • demenech

Poem

🐇 Hoppity-hop, the www is here,
Old portaljs.com links disappear!
Breadcrumbs now trail to the right domain,
"Showcase" is gone — "Case Studies" remains.
The SEO rabbit has tidied the warren,
Every canonical, no longer forlorn! 🌐

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title clearly summarizes the main change: a site-wide SEO audit fixing canonical consistency, titles, and structured data issues across multiple files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/seo-audit-2026

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (6)
site/pages/compare/ckan.tsx (1)

220-233: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

One breadcrumb URL still points to the old host.

This list still contains https://portaljs.com for Home while the updated entries use https://www.portaljs.com/*. Normalize Home too.

Suggested fix
{
  name: 'Home',
- item: 'https://portaljs.com',
+ item: 'https://www.portaljs.com',
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/ckan.tsx` around lines 220 - 233, In the BreadcrumbJsonLd
component within the items array, update the Home breadcrumb item URL from
'https://portaljs.com' to 'https://www.portaljs.com' to maintain consistency
with the other breadcrumb entries (Compare and CKAN Classic) which all use the
www subdomain. This ensures uniform URL formatting across all breadcrumb items
in the navigation structure.
site/pages/compare/custom-solution.tsx (1)

220-233: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Breadcrumb migration is incomplete in this block.

Home still uses https://portaljs.com while other breadcrumb items now use https://www.portaljs.com/.... Keep all breadcrumb items on the canonical host.

Suggested fix
{
  name: 'Home',
- item: 'https://portaljs.com',
+ item: 'https://www.portaljs.com',
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/custom-solution.tsx` around lines 220 - 233, The
BreadcrumbJsonLd component in the custom-solution.tsx file has an inconsistent
URL for the Home breadcrumb item. The Home item uses https://portaljs.com while
the Compare and Custom Solution items use https://www.portaljs.com. Update the
item URL in the Home breadcrumb object to use https://www.portaljs.com to
maintain consistency with the canonical host used in the other breadcrumb items
within the same BreadcrumbJsonLd items array.
site/pages/compare/arcgis-hub.tsx (1)

220-233: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Breadcrumb hostnames are still inconsistent in this updated section.

Compare and ArcGIS Hub were moved to www, but Home remains https://portaljs.com. This should be unified to the canonical host.

Suggested fix
{
  name: 'Home',
- item: 'https://portaljs.com',
+ item: 'https://www.portaljs.com',
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/arcgis-hub.tsx` around lines 220 - 233, The
BreadcrumbJsonLd component in the arcgis-hub.tsx file has inconsistent hostnames
across its breadcrumb items. The Home item uses https://portaljs.com without the
www subdomain, while the Compare and ArcGIS Hub items use
https://www.portaljs.com with the www subdomain. Update the Home item's URL to
include www (https://www.portaljs.com) to ensure all breadcrumb items use the
same canonical hostname format.
site/pages/openmetadata.tsx (1)

61-70: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Normalize the remaining breadcrumb host to www in this updated block.

This breadcrumb list is still mixed-domain (Home is https://portaljs.com while the updated item is https://www.portaljs.com/openmetadata), which undermines the canonical-domain migration in this page’s structured data.

Suggested fix
<BreadcrumbJsonLd
  items={[
    {
      name: 'Home',
-     item: 'https://portaljs.com',
+     item: 'https://www.portaljs.com',
    },
    {
      name: 'OpenMetadata',
      item: 'https://www.portaljs.com/openmetadata',
    },
  ]}
/>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/openmetadata.tsx` around lines 61 - 70, The BreadcrumbJsonLd
component in the openmetadata page has inconsistent domain formats across its
items array. The 'Home' breadcrumb item uses 'https://portaljs.com' (without
www) while the 'OpenMetadata' item uses 'https://www.portaljs.com/openmetadata'
(with www). Update the Home item's URL to include the www prefix
('https://www.portaljs.com') to ensure all breadcrumb items use the normalized
canonical domain format.
site/pages/compare/index.tsx (1)

99-108: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Complete the breadcrumb migration by updating Home to www.

This block still emits https://portaljs.com for Home while Compare is https://www.portaljs.com/compare, leaving mixed canonical signals in JSON-LD.

Suggested fix
{
  name: 'Home',
- item: 'https://portaljs.com',
+ item: 'https://www.portaljs.com',
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/index.tsx` around lines 99 - 108, In the BreadcrumbJsonLd
component within the items array, update the Home item's URL from
https://portaljs.com to https://www.portaljs.com to maintain consistent
canonical domain usage across all breadcrumb items. The Compare item is already
using the www subdomain, so the Home item should also use www to ensure uniform
domain signals in the JSON-LD output.
site/pages/purview.tsx (1)

60-69: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Breadcrumb JSON-LD still mixes non-www and www URLs.

Home remains https://portaljs.com while the updated page item is https://www.portaljs.com/purview. Keep hosts consistent to avoid continuing canonical fragmentation signals.

Suggested fix
{
  name: 'Home',
- item: 'https://portaljs.com',
+ item: 'https://www.portaljs.com',
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/purview.tsx` around lines 60 - 69, The BreadcrumbJsonLd component
in purview.tsx has inconsistent URL formats between its items - the Home item
URL is https://portaljs.com (without www) while the Microsoft Purview item URL
is https://www.portaljs.com/purview (with www). Update the Home item's URL in
the BreadcrumbJsonLd items array to match the same domain format as the
Microsoft Purview item (use www.portaljs.com instead of portaljs.com) to
maintain consistent hosts and avoid canonical fragmentation signals.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@site/content/case-studies/london-borough-of-hounslow.md`:
- Around line 61-68: The FAQ answer to "How much can a council realistically
save by moving to PortalJS Cloud?" presents a specific "50%" cost reduction
metric without documentation or sourcing. Either locate and add a reference to
the source data (internal migration records, benchmark reports, or documented
metrics) for the 50% savings claim, or modify the phrasing to use qualifier
language such as "approximately 50%", "estimated 50%", or "up to 50%" to reflect
the level of certainty around this figure if exact documentation is not
available.

In
`@site/content/case-studies/open-energy-data-how-ssen-tackled-massive-challenge-portaljs-ckan.md`:
- Around line 61-68: The FAQ section contains unattributed scale metrics
("1TB/day", "10,000+ datasets", "3.8 million endpoints") that cannot be verified
from official SSEN sources, and "3.8 million endpoints" is semantically
confused—it appears to refer to homes/businesses served rather than data
endpoints. To fix this, either add explicit source attribution (e.g., "based on
Datopian's project analysis") to the answer for "Can the platform reliably serve
10,000+ published datasets?", soften claims with conditional language like
"estimates suggest", or replace metrics with figures from official SSEN
documentation. Additionally, clarify in the second FAQ answer what "3.8 million
endpoints" means—either specify it as homes/businesses served or replace with an
accurate count of actual data endpoints, ensuring consistency with how metrics
are defined elsewhere in the content.

In `@site/pages/ckan.tsx`:
- Around line 44-45: The breadcrumb array in the ckan.tsx file contains
inconsistent domain URLs - the CKAN breadcrumb item uses
`https://www.portaljs.com/ckan` with the www prefix, but the Home breadcrumb
item likely uses `https://portaljs.com` without the www prefix. Find the Home
breadcrumb item in the same breadcrumb array and update its URL to
`https://www.portaljs.com` to match the domain format used in the CKAN
breadcrumb item, ensuring consistency across all breadcrumb URLs to avoid
structured-data fragmentation.

In `@site/pages/compare/dataverse.tsx`:
- Around line 228-233: The breadcrumb chain in the BreadcrumbJsonLd array is
inconsistent with domain naming conventions. The Home breadcrumb item in the
array is using https://portaljs.com (without www), while the Compare and
Dataverse breadcrumb items use https://www.portaljs.com (with www). Update the
Home item's URL to include the www subdomain to match the other breadcrumb items
in the same array, ensuring consistent URL formatting throughout the breadcrumb
chain.

In `@site/pages/compare/dkan.tsx`:
- Around line 228-233: The breadcrumb structured data in the breadcrumb list has
inconsistent URL formats. The entries for 'PortalJS' and 'DKAN' use the
canonical host with www subdomain (https://www.portaljs.com), but the Home item
still points to a non-www URL. Update the Home breadcrumb item to use the same
canonical URL format (https://www.portaljs.com) to ensure consistency across all
breadcrumb entries and maintain a single canonical host.

In `@site/pages/compare/opendatasoft.tsx`:
- Around line 203-208: The breadcrumb JSON-LD array in the opendatasoft.tsx file
has a canonical host inconsistency where the Home item uses https://portaljs.com
(without www) while other breadcrumb items like the compare items use
https://www.portaljs.com (with www). Locate the Home breadcrumb item in the same
JSON-LD breadcrumb structure and update its URL to use https://www.portaljs.com
to maintain consistency with the www prefix used in the other breadcrumb items.

In `@site/pages/compare/socrata.tsx`:
- Around line 228-233: The breadcrumb array in the socrata.tsx file has
inconsistent URLs where Compare and Socrata items use the www version of
portaljs.com but the Home item still uses the non-www version. Locate the Home
breadcrumb item in the same breadcrumb array and update its URL from the non-www
format to use https://www.portaljs.com to maintain consistency with the other
breadcrumb items.

In `@site/pages/datahub.tsx`:
- Around line 65-66: The breadcrumb list in the DataHub page contains
inconsistent canonical URLs - the DataHub entry uses the www-prefixed domain
(https://www.portaljs.com/datahub) but the Home entry in the same breadcrumb
list uses a non-www version. Locate the Home breadcrumb item in the same
breadcrumb array and update its URL to use https://www.portaljs.com to match the
format of the DataHub entry, ensuring all breadcrumb entries consistently use
the www-prefixed canonical host.

In `@site/pages/git.tsx`:
- Around line 46-47: The Git breadcrumb item in the structured-data block has
been updated to use the www subdomain (https://www.portaljs.com/git), but the
Home breadcrumb entry in the same block still uses the non-www URL
(https://portaljs.com). Update the Home breadcrumb URL to also use the www
subdomain (https://www.portaljs.com) to maintain consistent hostname
normalization across all breadcrumb entries in this structured-data object.

---

Outside diff comments:
In `@site/pages/compare/arcgis-hub.tsx`:
- Around line 220-233: The BreadcrumbJsonLd component in the arcgis-hub.tsx file
has inconsistent hostnames across its breadcrumb items. The Home item uses
https://portaljs.com without the www subdomain, while the Compare and ArcGIS Hub
items use https://www.portaljs.com with the www subdomain. Update the Home
item's URL to include www (https://www.portaljs.com) to ensure all breadcrumb
items use the same canonical hostname format.

In `@site/pages/compare/ckan.tsx`:
- Around line 220-233: In the BreadcrumbJsonLd component within the items array,
update the Home breadcrumb item URL from 'https://portaljs.com' to
'https://www.portaljs.com' to maintain consistency with the other breadcrumb
entries (Compare and CKAN Classic) which all use the www subdomain. This ensures
uniform URL formatting across all breadcrumb items in the navigation structure.

In `@site/pages/compare/custom-solution.tsx`:
- Around line 220-233: The BreadcrumbJsonLd component in the custom-solution.tsx
file has an inconsistent URL for the Home breadcrumb item. The Home item uses
https://portaljs.com while the Compare and Custom Solution items use
https://www.portaljs.com. Update the item URL in the Home breadcrumb object to
use https://www.portaljs.com to maintain consistency with the canonical host
used in the other breadcrumb items within the same BreadcrumbJsonLd items array.

In `@site/pages/compare/index.tsx`:
- Around line 99-108: In the BreadcrumbJsonLd component within the items array,
update the Home item's URL from https://portaljs.com to https://www.portaljs.com
to maintain consistent canonical domain usage across all breadcrumb items. The
Compare item is already using the www subdomain, so the Home item should also
use www to ensure uniform domain signals in the JSON-LD output.

In `@site/pages/openmetadata.tsx`:
- Around line 61-70: The BreadcrumbJsonLd component in the openmetadata page has
inconsistent domain formats across its items array. The 'Home' breadcrumb item
uses 'https://portaljs.com' (without www) while the 'OpenMetadata' item uses
'https://www.portaljs.com/openmetadata' (with www). Update the Home item's URL
to include the www prefix ('https://www.portaljs.com') to ensure all breadcrumb
items use the normalized canonical domain format.

In `@site/pages/purview.tsx`:
- Around line 60-69: The BreadcrumbJsonLd component in purview.tsx has
inconsistent URL formats between its items - the Home item URL is
https://portaljs.com (without www) while the Microsoft Purview item URL is
https://www.portaljs.com/purview (with www). Update the Home item's URL in the
BreadcrumbJsonLd items array to match the same domain format as the Microsoft
Purview item (use www.portaljs.com instead of portaljs.com) to maintain
consistent hosts and avoid canonical fragmentation signals.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 064e9198-885d-4279-9fdb-e535c89dfce6

📥 Commits

Reviewing files that changed from the base of the PR and between fc5b6b7 and a1dc723.

📒 Files selected for processing (36)
  • site/components/schema/BlogStructuredData.tsx
  • site/components/schema/CaseStudiesStructuredData.tsx
  • site/components/schema/DataPortalStructuredData.tsx
  • site/components/schema/FaqStructuredData.tsx
  • site/components/schema/HomePageStructuredData.tsx
  • site/content/case-studies/a-global-transport-hub-building-a-shared-open-data-infrastructure-for-30-plus-transport-organizations.md
  • site/content/case-studies/eiti-fully-customizable-data-portal-in-minutes.md
  • site/content/case-studies/london-borough-of-hounslow.md
  • site/content/case-studies/modernizing-lincolnshire-county-council39s-open-data-portal.md
  • site/content/case-studies/open-energy-data-how-ssen-tackled-massive-challenge-portaljs-ckan.md
  • site/content/case-studies/uae-moei-scalable-platform-government-data-publishing.md
  • site/content/config.js
  • site/next-sitemap.config.js
  • site/pages/case-studies.tsx
  • site/pages/ckan.tsx
  • site/pages/compare/arcgis-hub.tsx
  • site/pages/compare/ckan.tsx
  • site/pages/compare/custom-solution.tsx
  • site/pages/compare/dataverse.tsx
  • site/pages/compare/dkan.tsx
  • site/pages/compare/index.tsx
  • site/pages/compare/opendatasoft.tsx
  • site/pages/compare/socrata.tsx
  • site/pages/data-portals.tsx
  • site/pages/datahub.tsx
  • site/pages/faq.tsx
  • site/pages/features.tsx
  • site/pages/git.tsx
  • site/pages/learn/index.tsx
  • site/pages/learn/metadata.tsx
  • site/pages/openmetadata.tsx
  • site/pages/opensource.tsx
  • site/pages/partners.tsx
  • site/pages/pricing.tsx
  • site/pages/purview.tsx
  • site/pages/solutions/open-data.tsx
💤 Files with no reviewable changes (2)
  • site/pages/faq.tsx
  • site/pages/case-studies.tsx

Comment on lines +61 to +68
- question: 'How much can a council realistically save by moving to PortalJS Cloud?'
answer: 'The London Borough of Hounslow cut its cloud infrastructure costs by 50% after migrating from self-hosted CKAN on AWS. Savings come from eliminating EC2, RDS, S3, and the associated DevOps overhead — moving to a predictable managed service cost instead.'
- question: 'Does our IT team still need to manage anything after migration?'
answer: 'No. PortalJS Cloud handles all infrastructure management, security patches, updates, and uptime monitoring. Your team focuses on data quality and publishing — not platform maintenance.'
- question: 'Will our existing portal URL and dataset links still work?'
answer: 'Yes. URL continuity is maintained during migration. Hounslow''s portal remained at data.hounslow.gov.uk and all existing dataset download links stayed fully functional for residents and researchers.'
- question: 'Is PortalJS Cloud a good fit for other UK local authorities?'
answer: 'Absolutely. PortalJS Cloud is used by multiple UK councils looking to reduce cost and complexity while maintaining a high-quality, accessible open data service for citizens. The managed model is especially well-suited to smaller authorities without dedicated technical teams.'

Copy link
Copy Markdown
Contributor

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

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n "50%|self-hosted CKAN on AWS|EC2|RDS|S3|Hounslow" site/content site/pages site/components

Repository: datopian/portaljs

Length of output: 14653


Add sourcing or context for the 50% savings claim in the FAQ.

The FAQ presents "50% reduction" as a specific metric without citing the underlying data. The case study describes real infrastructure challenges (EC2, RDS, S3) but does not reference where the 50% figure comes from. Either link to source materials (benchmark reports, migration metrics, internal data) or adjust the phrasing to reflect the nature of the savings (e.g., "approximately 50%" or "estimated 50%") if the exact figure is not documented.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/content/case-studies/london-borough-of-hounslow.md` around lines 61 -
68, The FAQ answer to "How much can a council realistically save by moving to
PortalJS Cloud?" presents a specific "50%" cost reduction metric without
documentation or sourcing. Either locate and add a reference to the source data
(internal migration records, benchmark reports, or documented metrics) for the
50% savings claim, or modify the phrasing to use qualifier language such as
"approximately 50%", "estimated 50%", or "up to 50%" to reflect the level of
certainty around this figure if exact documentation is not available.

Comment on lines +61 to +68
- question: 'How does PortalJS handle 1TB+ of energy data processed every day?'
answer: 'PortalJS is decoupled from the data ingestion layer. SSEN''s 1TB/day ETL pipeline feeds into CKAN''s datastore, while PortalJS serves as a lightweight, cached frontend — meaning data volume does not affect portal performance or user experience.'
- question: 'Can the platform reliably serve 10,000+ published datasets?'
answer: 'Yes. The CKAN backend scales horizontally for large catalogues. SSEN''s 10K+ datasets with 3.8 million endpoints are served reliably through optimised search, faceting, and API access — without degrading response times.'
- question: 'How is sensitive grid infrastructure data protected?'
answer: 'Access controls are managed at the CKAN level with role-based permissions. Sensitive operational data can be restricted to authenticated users while public datasets remain openly accessible — all within the same portal, with no additional infrastructure needed.'
- question: 'How does open energy data support net-zero goals?'
answer: 'By making energy data openly accessible and machine-readable, SSEN enables researchers, planners, and partners to build evidence-based tools that support the energy transition — from grid capacity planning to EV infrastructure modelling and renewable integration analysis.'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n "1TB/day|10,000\+|3\.8 million|endpoints|SSEN" site/content site/pages site/components

Repository: datopian/portaljs

Length of output: 15485


🏁 Script executed:

head -100 site/content/case-studies/open-energy-data-how-ssen-tackled-massive-challenge-portaljs-ckan.md | cat -n

Repository: datopian/portaljs

Length of output: 9564


🌐 Web query:

SSEN energy data portal 1TB daily 10000 datasets 3.8 million endpoints smart meters

💡 Result:

The SSEN (Scottish and Southern Electricity Networks) Distribution Data Portal serves as a centralized platform for stakeholders to access network energy data, including smart meter consumption information [1][2]. Regarding the specific figures mentioned in your query: Smart Meters and Data Volume: As of early 2024, SSEN reported having over 1.8 million smart meters in its north and south licence areas [3]. The company has noted in its privacy planning that it anticipates requesting and receiving data from approximately 3 million smart meters as the rollout progresses [4]. While SSEN processes significant volumes of data—reporting over 170 million smart meter readings per day [3]—there is no official, publicly cited figure of "1TB of data daily" or a specific "10,000 datasets" count linked to the portal in authoritative SSEN documentation. Portal Capabilities: The portal provides access to various datasets to support net-zero planning, including aggregated smart meter half-hourly consumption data at the Low Voltage (LV) feeder level [3][5]. To protect consumer privacy, this data is aggregated to ensure that readings are not representative of fewer than five properties [6][7][8]. The portal supports data access through direct downloads and an Application Programming Interface (API) [5][9]. For the most accurate and up-to-date information regarding available datasets and API documentation, please refer directly to the official SSEN Distribution Data Portal at https://data.ssen.co.uk/ [1].

Citations:


Clarify and source the scale metrics; resolve semantic confusion.

The FAQ claims lack attribution to official SSEN sources. Web searches of SSEN's public documentation (press releases, data portal specs) do not cite "1TB/day" or "10,000+ datasets"; SSEN instead documents 1.8M smart meters and 170M daily readings. Additionally, line 64 claims "3.8 million endpoints" but line 75 defines 3.8M as homes/businesses served—not data endpoints.

Recommend: Either add source attribution (e.g., "based on Datopian's project analysis"), soften to conditional language ("estimates suggest"), or replace with figures from official SSEN documentation. Clarify what "endpoints" means or use an accurate count.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@site/content/case-studies/open-energy-data-how-ssen-tackled-massive-challenge-portaljs-ckan.md`
around lines 61 - 68, The FAQ section contains unattributed scale metrics
("1TB/day", "10,000+ datasets", "3.8 million endpoints") that cannot be verified
from official SSEN sources, and "3.8 million endpoints" is semantically
confused—it appears to refer to homes/businesses served rather than data
endpoints. To fix this, either add explicit source attribution (e.g., "based on
Datopian's project analysis") to the answer for "Can the platform reliably serve
10,000+ published datasets?", soften claims with conditional language like
"estimates suggest", or replace metrics with figures from official SSEN
documentation. Additionally, clarify in the second FAQ answer what "3.8 million
endpoints" means—either specify it as homes/businesses served or replace with an
accurate count of actual data endpoints, ensuring consistency with how metrics
are defined elsewhere in the content.

Comment thread site/pages/ckan.tsx
Comment on lines +44 to 45
item: 'https://www.portaljs.com/ckan',
},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Complete breadcrumb domain migration in this trail.

This breadcrumb now mixes www.portaljs.com and portaljs.com, which keeps structured-data URL fragmentation. Update the Home breadcrumb item in the same array to https://www.portaljs.com as well.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/ckan.tsx` around lines 44 - 45, The breadcrumb array in the
ckan.tsx file contains inconsistent domain URLs - the CKAN breadcrumb item uses
`https://www.portaljs.com/ckan` with the www prefix, but the Home breadcrumb
item likely uses `https://portaljs.com` without the www prefix. Find the Home
breadcrumb item in the same breadcrumb array and update its URL to
`https://www.portaljs.com` to match the domain format used in the CKAN
breadcrumb item, ensuring consistency across all breadcrumb URLs to avoid
structured-data fragmentation.

Comment on lines +228 to 233
item: 'https://www.portaljs.com/compare',
},
{
name: 'Dataverse',
item: 'https://portaljs.com/compare/dataverse',
item: 'https://www.portaljs.com/compare/dataverse',
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

This breadcrumb chain still mixes www and non-www.

Compare and Dataverse now use www, but Home in the same BreadcrumbJsonLd array is still https://portaljs.com. Please update Home to https://www.portaljs.com.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/dataverse.tsx` around lines 228 - 233, The breadcrumb
chain in the BreadcrumbJsonLd array is inconsistent with domain naming
conventions. The Home breadcrumb item in the array is using https://portaljs.com
(without www), while the Compare and Dataverse breadcrumb items use
https://www.portaljs.com (with www). Update the Home item's URL to include the
www subdomain to match the other breadcrumb items in the same array, ensuring
consistent URL formatting throughout the breadcrumb chain.

Comment on lines +228 to 233
item: 'https://www.portaljs.com/compare',
},
{
name: 'DKAN',
item: 'https://portaljs.com/compare/dkan',
item: 'https://www.portaljs.com/compare/dkan',
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Breadcrumb structured data is only partially migrated.

The updated entries use https://www.portaljs.com, but Home in this same breadcrumb list still points to non-www. Normalize the Home item too to keep one canonical host.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/dkan.tsx` around lines 228 - 233, The breadcrumb
structured data in the breadcrumb list has inconsistent URL formats. The entries
for 'PortalJS' and 'DKAN' use the canonical host with www subdomain
(https://www.portaljs.com), but the Home item still points to a non-www URL.
Update the Home breadcrumb item to use the same canonical URL format
(https://www.portaljs.com) to ensure consistency across all breadcrumb entries
and maintain a single canonical host.

Comment on lines +203 to 208
item: 'https://www.portaljs.com/compare',
},
{
name: 'OpenDataSoft',
item: 'https://portaljs.com/compare/opendatasoft',
item: 'https://www.portaljs.com/compare/opendatasoft',
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Canonical host inconsistency remains in breadcrumb JSON-LD.

These updated breadcrumb items now use www, but the Home item in the same array still uses https://portaljs.com. Please migrate Home to https://www.portaljs.com.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/opendatasoft.tsx` around lines 203 - 208, The breadcrumb
JSON-LD array in the opendatasoft.tsx file has a canonical host inconsistency
where the Home item uses https://portaljs.com (without www) while other
breadcrumb items like the compare items use https://www.portaljs.com (with www).
Locate the Home breadcrumb item in the same JSON-LD breadcrumb structure and
update its URL to use https://www.portaljs.com to maintain consistency with the
www prefix used in the other breadcrumb items.

Comment on lines +228 to 233
item: 'https://www.portaljs.com/compare',
},
{
name: 'Socrata',
item: 'https://portaljs.com/compare/socrata',
item: 'https://www.portaljs.com/compare/socrata',
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Breadcrumb migration is incomplete in this page.

Compare and Socrata now point to https://www.portaljs.com, but Home in the same breadcrumb array is still non-www. Update that Home URL to match.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/compare/socrata.tsx` around lines 228 - 233, The breadcrumb array
in the socrata.tsx file has inconsistent URLs where Compare and Socrata items
use the www version of portaljs.com but the Home item still uses the non-www
version. Locate the Home breadcrumb item in the same breadcrumb array and update
its URL from the non-www format to use https://www.portaljs.com to maintain
consistency with the other breadcrumb items.

Comment thread site/pages/datahub.tsx
Comment on lines +65 to 66
item: 'https://www.portaljs.com/datahub',
},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Breadcrumb still has mixed canonical hosts.

The updated DataHub breadcrumb entry is www, but the Home entry in this same list is still non-www. Please align both to https://www.portaljs.com to avoid inconsistent structured-data URLs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/datahub.tsx` around lines 65 - 66, The breadcrumb list in the
DataHub page contains inconsistent canonical URLs - the DataHub entry uses the
www-prefixed domain (https://www.portaljs.com/datahub) but the Home entry in the
same breadcrumb list uses a non-www version. Locate the Home breadcrumb item in
the same breadcrumb array and update its URL to use https://www.portaljs.com to
match the format of the DataHub entry, ensuring all breadcrumb entries
consistently use the www-prefixed canonical host.

Comment thread site/pages/git.tsx
…ured data

- Standardise all canonical and OG URLs to https://www.portaljs.com (www)
  Previously ~18 pages used non-www or portaljs.org variants, causing
  canonical fragmentation across the sitemap and structured data.

- Fix sitemap base URL to https://www.portaljs.com

- Fix global defaults in content/config.js:
  - Twitter handle @datopian → @PortalJS_ (consistent with all schema components)
  - Add og:site_name 'PortalJS' to default OG config
  - Fix default OG image URL to www

- Remove duplicate SEO injection in case-studies.tsx, data-portals.tsx,
  and faq.tsx — each had both an inline generateNextSeo AND a structured
  data component doing the same thing, with conflicting canonical values

- Fix stale schema components (CaseStudiesStructuredData, DataPortalStructuredData):
  - Title/description were placeholder-quality ("See our client stories.")
  - Canonical and breadcrumbs pointed to /showcase (URL no longer exists)
  - Corrected to /case-studies and /data-portals respectively

- Improve thin page titles across Blog, FAQ, Pricing, Case Studies,
  Data Portals pages (bare words like "FAQ" or "Blog" → full descriptive titles)

- Add complete SEO (title, description, canonical, OG, Twitter) to pages
  that had none: features.tsx, solutions/open-data.tsx, opensource.tsx

- Fix solutions/open-data.tsx using HomePageStructuredData (wrong — injected
  homepage canonical); replaced with page-specific Head + BreadcrumbJsonLd

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
site/pages/openmetadata.tsx (1)

61-70: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix remaining mixed-domain breadcrumb URL

Line 65 still uses https://portaljs.com for the Home breadcrumb item while this page now canonicalizes to https://www.portaljs.com/openmetadata. That leaves structured data inconsistent and can reintroduce canonical fragmentation.

Suggested patch
           <BreadcrumbJsonLd
             items={[
               {
                 name: 'Home',
-                item: 'https://portaljs.com',
+                item: 'https://www.portaljs.com',
               },
               {
                 name: 'OpenMetadata',
                 item: 'https://www.portaljs.com/openmetadata',
               },
             ]}
           />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@site/pages/openmetadata.tsx` around lines 61 - 70, The BreadcrumbJsonLd
component in the openmetadata.tsx file has inconsistent domain URLs that cause
canonical fragmentation. The Home breadcrumb item uses the URL
https://portaljs.com (without www) while the page canonicalizes to
https://www.portaljs.com/openmetadata (with www). Update the item property in
the Home breadcrumb object within the BreadcrumbJsonLd items array to use
https://www.portaljs.com to maintain consistency with the page's canonical URL.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@site/pages/openmetadata.tsx`:
- Around line 61-70: The BreadcrumbJsonLd component in the openmetadata.tsx file
has inconsistent domain URLs that cause canonical fragmentation. The Home
breadcrumb item uses the URL https://portaljs.com (without www) while the page
canonicalizes to https://www.portaljs.com/openmetadata (with www). Update the
item property in the Home breadcrumb object within the BreadcrumbJsonLd items
array to use https://www.portaljs.com to maintain consistency with the page's
canonical URL.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1c7b9bff-be25-4cf5-9e2f-0559c415291a

📥 Commits

Reviewing files that changed from the base of the PR and between a1dc723 and b0fc081.

📒 Files selected for processing (30)
  • site/components/schema/BlogStructuredData.tsx
  • site/components/schema/CaseStudiesStructuredData.tsx
  • site/components/schema/DataPortalStructuredData.tsx
  • site/components/schema/FaqStructuredData.tsx
  • site/components/schema/HomePageStructuredData.tsx
  • site/content/config.js
  • site/next-sitemap.config.js
  • site/pages/case-studies.tsx
  • site/pages/ckan.tsx
  • site/pages/compare/arcgis-hub.tsx
  • site/pages/compare/ckan.tsx
  • site/pages/compare/custom-solution.tsx
  • site/pages/compare/dataverse.tsx
  • site/pages/compare/dkan.tsx
  • site/pages/compare/index.tsx
  • site/pages/compare/opendatasoft.tsx
  • site/pages/compare/socrata.tsx
  • site/pages/data-portals.tsx
  • site/pages/datahub.tsx
  • site/pages/faq.tsx
  • site/pages/features.tsx
  • site/pages/git.tsx
  • site/pages/learn/index.tsx
  • site/pages/learn/metadata.tsx
  • site/pages/openmetadata.tsx
  • site/pages/opensource.tsx
  • site/pages/partners.tsx
  • site/pages/pricing.tsx
  • site/pages/purview.tsx
  • site/pages/solutions/open-data.tsx
💤 Files with no reviewable changes (2)
  • site/pages/faq.tsx
  • site/pages/case-studies.tsx
✅ Files skipped from review due to trivial changes (7)
  • site/next-sitemap.config.js
  • site/components/schema/HomePageStructuredData.tsx
  • site/components/schema/FaqStructuredData.tsx
  • site/pages/compare/dkan.tsx
  • site/pages/datahub.tsx
  • site/pages/compare/opendatasoft.tsx
  • site/pages/opensource.tsx
🚧 Files skipped from review as they are similar to previous changes (20)
  • site/pages/learn/index.tsx
  • site/pages/solutions/open-data.tsx
  • site/pages/learn/metadata.tsx
  • site/pages/compare/index.tsx
  • site/pages/partners.tsx
  • site/pages/pricing.tsx
  • site/pages/compare/ckan.tsx
  • site/components/schema/DataPortalStructuredData.tsx
  • site/pages/compare/custom-solution.tsx
  • site/pages/git.tsx
  • site/content/config.js
  • site/pages/features.tsx
  • site/components/schema/CaseStudiesStructuredData.tsx
  • site/pages/purview.tsx
  • site/pages/compare/arcgis-hub.tsx
  • site/pages/compare/dataverse.tsx
  • site/pages/data-portals.tsx
  • site/pages/compare/socrata.tsx
  • site/pages/ckan.tsx
  • site/components/schema/BlogStructuredData.tsx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant