Borrissol’s project-wide settings are spread across three files that each own a clearly defined domain: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.
astro.config.mjs controls the framework, adapters, integrations, routing and redirects; src/config/site.ts centralises every SEO token and business detail that feeds structured data; and src/config.ts holds the WhatsApp deep-link utility consumed by all four language variants of the site. Keeping these three files in sync is the first step before going live or after any rebrand.
astro.config.mjs
The root framework config. It declares the deployment target, trailing-slash policy, 301 redirects, all integrations, and the i18n routing strategy.
astro.config.mjs
site
adapter
@astrojs/netlify (^7.0.12). All pages are statically prerendered except the Keystatic admin routes, which require SSR. The adapter wraps those in Netlify Functions automatically with no extra configuration.
trailingSlash
/es/tallers not /es/tallers/). The Netlify adapter enforces this at the edge.
redirects
All redirects are declarative 301s in the Astro config. They fall into two groups:
Legacy /ca/* → /* — Catalan is the default locale served at root (no /ca/ prefix). Any legacy URLs with the /ca prefix get permanently redirected to strip it.
/<lang>/blog → /blog — The blog is intentionally Catalan-only. Non-Catalan blog URLs redirect to the Catalan blog so shared links and old bookmarks still resolve.
Astro requires redirect destinations to match real routes. Wildcards like
/ca/* do not work in Astro’s redirects object — each sub-route must be listed explicitly.integrations
| Integration | Package | Purpose |
|---|---|---|
sitemap() | @astrojs/sitemap ^3.7.3 | Generates sitemap.xml with hreflang rel="alternate" entries for all four locales. Mirrors the hreflang tags already in each page’s <head>. |
react() | @astrojs/react ^5.0.7 | Required by Keystatic’s admin UI, which is a React application. No React is used on public-facing pages. |
markdoc() | @astrojs/markdoc ^1.0.6 | Renders blog post bodies written in Markdoc (a superset of Markdown). |
keystatic() | @keystatic/astro ^5.0.6 | Mounts the Keystatic admin at /keystatic and handles the Git-backed CMS API routes. |
i18n
| Key | Value | Meaning |
|---|---|---|
defaultLocale | 'ca' | Catalan content is served at root (e.g. /tallers). |
locales | ['ca', 'es', 'en', 'fr'] | The four supported languages. |
prefixDefaultLocale | false | Catalan URLs have no language prefix; Spanish, English and French are prefixed (/es/, /en/, /fr/). |
src/config/site.ts
This file exports the SITE constant — a single object that every SEO and structured-data component reads from. It is the single source of truth for the business name, address, contact details, hours, and social links.
Type definitions
The SITE export
src/config/site.ts
Key fields
| Field | Value | Used by |
|---|---|---|
url | https://borrissol.com | Canonical URLs, Open Graph, JSON-LD |
locale | es_ES | Open Graph og:locale |
logo | /images/borrissol-logo-b-512.png | JSON-LD Organization.logo (512×512px per Google spec) |
defaultOgImage | /og-default.jpg | Fallback og:image for pages without a cover photo |
business.type | LocalBusiness | JSON-LD @type — controls which Google rich results are eligible |
business.geo | 41.5373926, 2.4466578 | JSON-LD geo node — places the business in Google’s local map pack |
business.openingHours | ['Mo-Sa 09:30-13:30', 'Mo-Sa 16:30-20:30'] | JSON-LD openingHours — shown in Knowledge Panel |
business.sameAs | Instagram, TikTok URLs | JSON-LD sameAs — reinforces entity disambiguation |
src/config.ts
A minimal module that exposes the WhatsApp contact number and the waHref URL builder.
src/config.ts
waHref(text)
Builds a WhatsApp deep link with a pre-filled message. Every CTA button and the floating WhatsApp FAB call waHref() with a locale-specific message string fetched from src/i18n/ui.ts. The resulting URL opens the WhatsApp app (or web) with the message pre-composed, ready to send.
Example:
Environment variables
No.env file is required. All project configuration is in code. Keystatic Cloud credentials (used for authenticating the /keystatic admin in production) are configured through the Keystatic Cloud dashboard and injected by Netlify at build/runtime — they are never stored locally.
Node version
The project requires Node ≥ 22.12.0, declared inpackage.json and pinned in netlify.toml:
netlify.toml
.npmrc
.npmrc
legacy-peer-deps=true is required to resolve a peer dependency conflict between @keystatic/astro 5.0.6 and Astro 6. Without it, npm install exits with an ERESOLVE error. Do not remove this flag until the upstream conflict is resolved in a future Keystatic release.