All SEO metadata in Borrissol flows through two files:Documentation Index
Fetch the complete documentation index at: https://mintlify.com/constanza101/borrissol/llms.txt
Use this file to discover all available pages before exploring further.
src/components/Seo.astro, which is included in the <head> of every page, and src/config/site.ts, which holds every business detail and URL in one central place. This architecture means there is a single canonical source for the business name, telephone number, postal address, opening hours, and social links — changing a value in site.ts propagates to every JSON-LD schema, every Open Graph tag, and every page automatically. The result is a consistent Lighthouse SEO score of 100 across all pages.
Central site config (src/config/site.ts)
The SITE export is the authoritative record for all business metadata:
src/config/site.ts
geo coordinates place the business in Google’s local map pack for location-intent searches (“tufting workshop near me”). The sameAs array links the entity to its verified social profiles.
JSON-LD structured data
Seo.astro emits several JSON-LD schemas on every relevant page. All data is drawn from SITE — nothing is hardcoded inside the component.
LocalBusiness
Includes name, full postal address, geo coordinates, telephone,
openingHours, priceRange, and sameAs links to Instagram and TikTok.Organization
Emitted alongside
LocalBusiness. Includes the logo as an ImageObject node with explicit 512×512 pixel dimensions — required for Google rich results eligibility.FAQPage
Generated dynamically from FAQ sections on landing pages. Each question–answer pair in
ui.ts (e.g. tb.faq.q1 / tb.faq.a1) is serialized into a Question entity.CourseSchema
Applied to workshop landing pages (Team Building, Pelussetes, Borla, Summer Textile Lab). Includes an
AggregateOffer covering the price range for the course format.AggregateRating node is also emitted globally: 5.0 out of 5 · 28 reviews, sourced from the Google Maps reviews displayed in the testimonials section.
Open Graph and Twitter Card
Seo.astro writes the full set of Open Graph and Twitter Card meta tags on every page:
og:title,og:description,og:url,og:image,og:image:width,og:image:heightog:locale(fromlocaleMapinutils.ts— e.g.ca_ES,es_ES,en_US,fr_FR)og:locale:alternatetags for the other three localestwitter:cardset tosummary_large_imagetwitter:title,twitter:description,twitter:image
Hreflang tags
Every page’s<head> contains <link rel="alternate" hreflang="..."> tags for all four locales plus x-default, generated by Seo.astro using getAlternatePath from utils.ts. The sitemap reinforces this signal:
astro.config.mjs
filter keeps stray /ca/* paths from appearing in the sitemap (they were the old URL structure before the [lang] refactor and are now handled by 301 redirects).
Canonical URLs
Each page sets its own canonical URL via a<link rel="canonical"> tag in Seo.astro. The canonical always points to the current page’s definitive URL (including the locale prefix for non-default locales), preventing duplicate-content signals between language variants.
Per-page title and description
Each landing page passes itstitleKey and descKey props to LandingPage.astro, which resolves them through useTranslations against the ui.ts catalog. This means page titles and meta descriptions are fully translated for all four locales without any additional per-page SEO work. For example:
| Key | CA | ES | EN |
|---|---|---|---|
page.tb.title | Team Building Creatiu… | Team Building Creativo… | Creative Team Building… |
page.tb.description | Team building tèxtil… | Team building textil… | Textile team building… |
Sitemap
The sitemap is generated by@astrojs/sitemap at build time. It includes all statically prerendered pages with their hreflang cross-references. A defensive filter strips any URL containing /ca to guard against stale routes re-emerging after refactors.
robots.txt
The robots.txt file allows all crawlers on / and explicitly lists the sitemap URL. Common social and search bots (Googlebot, Twitterbot, facebookexternalhit, etc.) are explicitly permitted. WordPress/PHP probe paths like /wp-admin/ and /.env are blocked at the Netlify edge layer via netlify.toml redirect rules before they ever reach Astro.
OG image guidelines
Per-page OG images follow the same constraints. Always export from Figma as JPG with quality ~85, verify the file size withls -lh, and commit only after confirming it is under 300 KB.
Lighthouse scores
| Category | Score |
|---|---|
| Performance | 99 |
| Accessibility | 97 |
| Best Practices | 100 |
| SEO | 100 |