This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Nebulix is a static site generator theme built on Astro + Static CMS, configured to serve as a restaurant menu website (El Palacio). It's a multi-purpose platform that can handle blogs, portfolios, webshops (via Snipcart), and restaurant menus. The project is currently deployed on Netlify with the root redirecting to /menu/main/.
Tech Stack: Astro, MDX, Vue 3, TailwindCSS, Pagefind, Snipcart, Static CMS, Nanostores
# Install dependencies
npm install
# Development server (localhost:4321)
npm run dev
# Static CMS local backend proxy server
npm run cms-proxy-server
# Build for production (runs Pagefind post-build)
npm run build
# Preview production build
npm run preview
# Astro CLI commands
npm run astro -- --help
npm run astro check # Type checkingCreate .env from env.txt template. Required variables:
- Content slugs:
BLOG_SLUG,PORTFOLIO_SLUG,SHOP_SLUG,MENU_SLUG - Localization:
WEBSITE_LANGUAGE(en/es/de/nl/hr/fr),CURRENCY,UNITS - Shop:
SNIPCART_KEY - Newsletter:
NEWSLETTER_PROVIDER, mailchimp config - Contact forms: Mailgun, Postmark, or Slack credentials
- Build:
NODE_VERSION(18)
Defined in src/content/config.ts with Zod schemas:
- blog - Blog posts with tags, MDX body, blocks
- project - Portfolio items with features, tags
- product - E-commerce products with variations, Snipcart integration
- menu - Restaurant menus with nested structure:
categories[]→menu_items[]→price[],details(allergens, labels)
- page - General pages with page builder blocks
- config - Site settings, navigation, tags, categories
Content types support a blocks array for modular page building. Block components in src/components/block/:
TextImage- Text with image layoutFeatures- Feature grid with iconsImageGallery- Image gallery displayPricingTable- Pricing comparison tablesRecentItems- Dynamic recent posts/projects/productsShopCategories/ShopProducts- E-commerce displaysRichText- Markdown content blocks
Blocks are rendered via src/components/block/Block.astro which routes to appropriate component.
/[...slug].astro- General pages frompagecollection/blog/[...slug].astro- Blog posts/blog/[...page].astro- Paginated blog archive/blog/tag/[...slug].astro- Tag-filtered blog pages/work/[...slug].astro- Portfolio projects/work/[...page].astro- Paginated portfolio/shop/[...slug].astro- Product pages/shop/category/[...slug].astro- Product categories/menu/[...slug].astro- Menu pages/menu/main.astro- Custom main menu landing page/admin.astro- Static CMS admin interface
CMS configuration in src/pages/admin.astro:
- Collection schemas in
src/cms/*.mjs(menu, page, post, project, product, settings) - Backend config at line 21-23 (currently
test-repo) - Local backend support via
cms-proxy-server - Access at
http://localhost:4321/admin/
Important: Update backend config for production (GitLab/GitHub/Git Gateway). See README.md lines 83-109 for GitLab PKCE example.
Global state in src/store.js:
activeProduct- Current product selection (Snipcart)productVariations- Product variation optionsproductExtraPrice- Additional pricing from variationsshowContact- Contact dialog visibility
Vue components integrate with @nanostores/vue.
Translation system in src/util/translate.ts:
- Reads from
src/locales/{lang}.jsonbased onWEBSITE_LANGUAGEenv var - Use
t(key)function for translations - Falls back to English if translation missing
TailwindCSS with custom color system (tailwind.config.cjs):
- CSS variables for theme colors:
--color-primary,--color-secondary, etc. - Dark mode via
data-theme="dark"attribute - Container queries plugin enabled
- Responsive breakpoints include custom
xs: 500px
Global styles in src/styles/global.css, scoped styles use attribute strategy.
Key functions:
slugify(str)- URL-safe slug generation with diacritic supportgetArchiveNav(count, index, posts)- Prev/next navigation for archivesgetPagination(posts, filters, data, type)- Pagination for filtered contentgetCategoryData(categories, category)- Find category config by namegetIconName(icon)- Extract icon name from pathgetImageUrl/Name/TransitionName(thumbnail)- Image helpers
Contact forms and newsletter handled via edge functions (edge-functions/):
/api/subscribe-mailchimp- Newsletter subscription/api/contact-slack- Slack notifications/api/contact-mailgun- Mailgun email/api/contact-postmark- Postmark email
Configured in netlify.toml.
Uses astro-imagetools integration:
- Auto-optimization for images in content
- Responsive image sizing via
getGridImageSizes(container)helper - Image viewing via
/images/[slug].astrowith PanZoom support
Pagefind integration:
- Post-build indexing:
pagefind --site dist --output-path dist/_pagefind - Search UI in
src/components/common/PageFind.vue - Pagefind scripts served from
src/pages/_pagefind/
- Icon transformations: Icons referenced in MDX/CMS are transformed via
getIconName()in Zod schemas - Number parsing: Price/aspect fields use
.transform()to handle string/number types from CMS - Menu structure: Menus use deeply nested arrays (categories → items → prices) unlike flat blog/product models
- Allergen/Label icons: Menu items support allergen warnings and dietary labels via icon system
- MDX Components: Auto-imported components via
astro-m2dxwithsrc/content/_components.ts
Deadline: Jueves 6:00 PM
Los sabores/productos que rotan se encuentran en src/content/menu/drinks.mdx:
| Campo | Línea aprox. | Ejemplo actual |
|---|---|---|
| Curado de temporada | ~90 | intro: "Guayaba" |
| Curado a la Carta | ~104 | intro: "Sorpresa, Ponche" |
| Curado Especial | ~118-122 | "Vino, Nanche" |
| Torito | ~240 | "Guanábana y Mango" |
| Chela Célebres | ~144 | intro: "Nochebuena" |
| Recomendación destacada | ~22-32 | Producto destacado de la semana |
- Recibir cambios de Slack (canal de El Palacio)
- Editar
drinks.mdxy/ococtails.mdx - Commit con mensaje:
menu: actualiza sabores semana [fecha] - Push al repositorio (deploy automático en Netlify)
Usar /menu para iniciar el flujo de actualización guiado.
Actualiza el menú:
- Curado de temporada: Piña
- Curado a la Carta: Fresa, Mango
- Curado Especial: Café, Nuez
- Torito: Cacahuate
- Chela Célebres: Modelo Especial
CC BY-ND 4.0 license. Purchase from https://nebulix.unfolding.io/shop/nebulix-license/ to remove attribution requirement.
- Workspace: El Palacio Negro
- MCP Server: slack-palacio
- Canal: #nueva-carta-2025 (C06SNHDV8LB)
Para revisar conversaciones de Slack sobre este proyecto, usa las herramientas del MCP slack-palacio:
slack_get_channel_historycon channelC06SNHDV8LBslack_get_thread_repliespara hilos completos
Cuando te pidan revisar tareas o cambios pendientes, lee el historial y extrae action items.
Negocio: Palacio Proyecto: elpalacio-menu
Al terminar la sesion de trabajo, registra lo realizado usando /bitacora o menciona "terminamos" para que se guarde automaticamente en Obsidian (JorgeTrabaja/Palacio/elpalacio-menu/).