The blog is intentionally Catalan-only. Belén (the studio founder and sole author) writes in Catalan, and maintaining translated versions of every post would add unsustainable editorial overhead for a one-person operation. Non-Catalan visitors who navigate toDocumentation 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.
/es/blog, /en/blog, or /fr/blog are silently redirected to /blog via 301 redirects configured in astro.config.mjs. This keeps the URL structure clean without surfacing broken or empty pages.
Routes
| Route | File | Notes |
|---|---|---|
/blog | src/pages/blog/index.astro | Post listing, sorted by publishedAt descending |
/blog/[slug] | src/pages/blog/[slug].astro | Individual post, rendered from MDX via Content Collections |
/ca/blog, /es/blog, /en/blog, /fr/blog | — | 301 redirect → /blog (in astro.config.mjs) |
/ca/blog/[slug], /es/blog/[slug], /en/blog/[slug], /fr/blog/[slug] | — | 301 redirect → /blog/[slug] (in astro.config.mjs) |
/keystatic | Keystatic serverless handler | Auth-gated CMS panel (production only) |
Content storage
Blog posts are MDX files stored insrc/content/blog/. Each file is named after the post slug (e.g. com-funciona-el-tufting.mdx). The Keystatic CMS creates and commits these files automatically when Belén publishes via the editor UI — no manual file creation is needed.
public/blog/images/[post-slug]/ and referenced at /blog/images/[post-slug]/filename.jpg. They are served as static assets, not processed through the Astro image pipeline.
Post schema
The schema is defined inkeystatic.config.ts. Every field maps directly to frontmatter in the generated MDX file:
| Field | Type | Notes |
|---|---|---|
title | fields.slug | Dual-purpose: display title + auto-generates the URL slug |
summary | fields.text | Max 160 chars; used as meta description and card excerpt |
publishedAt | fields.date | Required; used for sorting and formatted display |
coverImage | fields.image | Stored in public/blog/images/; referenced at /blog/images/... |
content | fields.markdoc | Full post body (Markdoc format), rendered via render(post) from astro:content |
The
title field uses fields.slug rather than fields.text. Keystatic automatically derives the slug from the title, lowercasing and hyphenating it. The slug becomes the file name and the URL path segment — /blog/[slug].Blog index page
src/pages/blog/index.astro fetches all published posts with getCollection('blog'), sorts them newest-first, and renders a 3-column card grid (2 columns at ≤840px, 1 column at ≤540px):
- Cover image (600×400,
loading="lazy",aspect-ratio: 3/2) - Publication date formatted as
d de MMMM de YYYYin Catalan (ca-ESlocale) - Post title
- Summary excerpt
- “Llegir →” CTA link
posts.length === 0, a placeholder <p>Pròximament…</p> is shown instead of the grid — useful during initial setup before any posts are published.
The page head metadata is hardcoded in ca (not driven by ui.ts):
caOnly prop on Layout.astro signals that the page should not be indexed by non-Catalan crawlers and omits hreflang alternate tags for the other locales.
Individual post page
src/pages/blog/[slug].astro resolves the post from getCollection('blog') by matching post.id === slug, then renders it with render(post) from astro:content:
- Back link (
← Blog) - Publication date (formatted
ca-ES) - H1 title
- Summary paragraph
- Cover image (1200×630,
loading="eager",aspect-ratio: 16/9) - MDX body content (
<Content />) - In-page booking CTA aside
- ”← Tornar al blog” footer link
In-page booking CTA
Every post ends with a styled<aside> that prompts visitors to book a workshop. The WhatsApp link pre-fills a message attributing the enquiry to the blog:
Keystatic CMS workflow
1. Open the editor
Belén navigates to
borrissol.com/keystatic and signs in via Keystatic Cloud authentication.2. Create or edit a post
The Keystatic UI presents the schema fields (title, summary, date, cover image, Markdoc body editor). Belén fills them in and saves.
3. Commit to GitHub
On publish, Keystatic opens a pull request (or pushes directly) to a
keystatic/[slug] branch on constanza101/borrissol. The MDX file lands in src/content/blog/.4. Auto-deploy
Netlify detects the push and triggers a production build. The new post is live within ~2 minutes.
Storage mode by environment
| Environment | Storage mode | Auth required |
|---|---|---|
NODE_ENV !== 'production' (local dev) | local — reads/writes directly to the filesystem | None |
Production (NODE_ENV === 'production') | github — commits to constanza101/borrissol via Keystatic Cloud | Keystatic Cloud OAuth |
In local development, the Keystatic panel at
localhost:4321/keystatic is accessible without login. It reads from and writes to src/content/blog/ on your local filesystem. There is no network call to GitHub.Netlify deploy credits
To add a post without triggering unnecessary previews, Keystatic is configured withbranchPrefix: 'keystatic/'. The netlify.toml ignores these branches for preview deploys, so the credit cost per published post is exactly one production build.