{"id":48798439,"url":"https://github.com/cedric-v/fluance-io","last_synced_at":"2026-04-14T00:31:37.011Z","repository":{"id":327261721,"uuid":"1107496156","full_name":"cedric-v/fluance-io","owner":"cedric-v","description":"Fluance.io website: content, build and deployement workflow","archived":false,"fork":false,"pushed_at":"2026-03-09T18:09:14.000Z","size":25669,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-09T18:33:44.741Z","etag":null,"topics":["11ty","github-actions","jamstack","javascript","markdown","markdown-to-html","mjml","multilingual","nodejs","nunjucks","responsive-design","static-site-generator","tailwindcss"],"latest_commit_sha":null,"homepage":"http://fluance.io","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cedric-v.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":"COPYRIGHT","agents":null,"dco":null,"cla":null}},"created_at":"2025-12-01T08:11:24.000Z","updated_at":"2026-03-09T18:09:18.000Z","dependencies_parsed_at":"2026-01-05T06:03:04.080Z","dependency_job_id":null,"html_url":"https://github.com/cedric-v/fluance-io","commit_stats":null,"previous_names":["cedric-v/fluance-io"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cedric-v/fluance-io","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedric-v%2Ffluance-io","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedric-v%2Ffluance-io/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedric-v%2Ffluance-io/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedric-v%2Ffluance-io/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cedric-v","download_url":"https://codeload.github.com/cedric-v/fluance-io/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedric-v%2Ffluance-io/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31776877,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T00:11:49.126Z","status":"ssl_error","status_checked_at":"2026-04-14T00:10:29.837Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["11ty","github-actions","jamstack","javascript","markdown","markdown-to-html","mjml","multilingual","nodejs","nunjucks","responsive-design","static-site-generator","tailwindcss"],"created_at":"2026-04-14T00:31:35.075Z","updated_at":"2026-04-14T00:31:36.967Z","avatar_url":"https://github.com/cedric-v.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Fluance.io\n\nFluance.io is a multilingual (FR/EN) static website built with [Eleventy](https://www.11ty.dev/) and [Tailwind CSS](https://tailwindcss.com/).  \nIt is designed to be simple to develop locally, deploy on static hosting (GitHub Pages, Netlify, etc.), and easy to maintain over time.\n\n---\n\n### Tech stack\n\n- **Eleventy 3** as static site generator\n- **Nunjucks** templates\n- **Tailwind CSS 4** for styling (CSS-first configuration)\n- **Node.js / npm** for tooling\n\n---\n\n### Performance optimizations\n\nThe site includes several performance optimizations to ensure fast loading and smooth user experience:\n\n#### Image optimization\n\n- **WebP support with automatic fallback**: Images are automatically served in WebP format when available, with fallback to original formats (JPG/PNG) for compatibility\n- **Explicit dimensions**: All images include `width` and `height` attributes to prevent Cumulative Layout Shift (CLS)\n- **Lazy loading**: Images below the fold use `loading=\"lazy\"` for faster initial page load\n- **Eager loading for LCP**: Hero images and critical images use `loading=\"eager\"` and `fetchpriority=\"high\"` for optimal Largest Contentful Paint (LCP)\n- **Responsive positioning**: Hero images use responsive `object-position` (centered on mobile, right-aligned on desktop)\n\n#### Navigation optimization\n\n- **Link prefetching**: Menu links are prefetched on hover (with 100ms delay) to accelerate page transitions\n- **Smooth transitions**: CSS transitions reduce visual flicker during navigation\n- **Optimized event listeners**: Uses `passive: true` for better scroll performance\n\n#### Font loading\n\n- **Preconnect**: Early connection to Google Fonts and external resources\n- **Preload**: Critical Inter font is preloaded for faster rendering\n- **Font-display**: Uses `font-display: optional` to prevent layout shifts\n\n#### CSS and resource loading\n\n- **CSS preload**: Critical CSS is preloaded asynchronously\n- **Minification**: Production builds include minified HTML, CSS, and JavaScript\n- **Will-change optimization**: Applied only during active transitions to avoid unnecessary layer creation\n\n#### Core Web Vitals\n\nThe site is optimized for Google's Core Web Vitals:\n- **LCP (Largest Contentful Paint)**: Optimized with eager loading and preconnect hints\n- **FID/INP (First Input Delay / Interaction to Next Paint)**: Reduced with passive event listeners and optimized JavaScript\n- **CLS (Cumulative Layout Shift)**: Minimized with explicit image dimensions and stable font loading\n\n---\n\n### Prerequisites\n\n- **Node.js** (recommended: latest LTS)\n- **npm** (comes with Node)\n- A **GitHub** account (for deployment with GitHub Pages or CI)\n\n---\n\n### Installation\n\nClone the repository and install dependencies:\n\n```bash\ngit clone https://github.com/cedric-v/fluance-io.git\ncd fluance-io\nnpm install\n```\n\n---\n\n### Local development\n\nStart the Eleventy dev server and Tailwind watcher:\n\n```bash\nnpm start\n```\n\nThis will:\n\n- Run Eleventy in dev mode with live reload at `http://localhost:8080/`\n- Build Tailwind CSS from `src/assets/css/styles.css` to `_site/assets/css/styles.css` in watch mode\n\nThe main pages are:\n\n- Root (redirects to FR): `http://localhost:8080/`\n- French homepage: `http://localhost:8080/fr/`\n- English homepage: `http://localhost:8080/en/`\n\nStop the dev server with `Ctrl + C`.\n\n---\n\n### Project structure\n\n- `src/` – source content and templates\n  - `_includes/` – base layout, header, footer\n  - `fr/` – French content (e.g. `index.md`, `a-propos/philosophie.md`)\n  - `en/` – English content (e.g. `index.md`)\n  - `index.njk` – root index, redirects to `/fr/`\n  - `sitemap.njk` – sitemap.xml generator template\n  - `robots.txt` – robots.txt file (copied to root)\n  - `llms.txt` – LLM-friendly site description (copied to root)\n  - `assets/css/styles.css` – Tailwind input CSS\n- `_site/` – generated static site (ignored by git)\n  - `sitemap.xml` – automatically generated sitemap\n  - `robots.txt` – copied from src/\n  - `llms.txt` – copied from src/\n- `eleventy.config.js` – Eleventy configuration (i18n, filters, transforms, shortcodes)\n- `tailwind.config.js` – Tailwind configuration\n\n---\n\n### Available npm scripts\n\nFrom `package.json`:\n\n- **`npm start`**\n\n  Runs both dev servers:\n\n  ```bash\n  npm-run-all --parallel dev:*\n  ```\n\n- **`npm run dev:11ty`**\n\n  Eleventy dev server with live reload:\n\n  ```bash\n  cross-env ELEVENTY_ENV=dev eleventy --serve\n  ```\n\n- **`npm run dev:css`**\n\n  Tailwind CSS in watch mode:\n\n  ```bash\n  npx tailwindcss -i ./src/assets/css/styles.css -o ./_site/assets/css/styles.css --watch\n  ```\n\n- **`npm run build`**\n\n  Production build for deployment:\n\n  ```bash\n  cross-env ELEVENTY_ENV=prod npm-run-all build:css build:11ty\n  ```\n\n- **`npm run build:11ty`**\n\n  ```bash\n  eleventy\n  ```\n\n- **`npm run build:css`**\n\n  ```bash\n  npx tailwindcss -i ./src/assets/css/styles.css -o ./_site/assets/css/styles.css --minify\n  ```\n\n---\n\n### Building for production\n\nGenerate a production build (minified HTML, CSS, JS):\n\n```bash\nnpm run build\n```\n\nOutput:\n\n- Static files are written to the `_site/` directory.\n- This folder can be served by any static hosting provider (GitHub Pages, Netlify, S3, etc.).\n\n---\n\n### Deployment\n\nYou can deploy the content of `_site/` **as a static website**. The project is configured to use **GitHub Pages** via GitHub Actions.\n\n#### GitHub Pages (via GitHub Actions)\n\nRecommended: automatically build and deploy the site on each push to `main` using GitHub Actions.\n\n1. In your repo, create the directory `.github/workflows/` (if it does not exist).\n2. Add a file `.github/workflows/deploy.yml` with this content:\n\n```yaml\nname: Deploy site to GitHub Pages\n\non:\n  push:\n    branches: [ main ]\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: true\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: 'lts/*'\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Build site\n        env:\n          ELEVENTY_ENV: prod\n        run: npm run build\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: _site\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n3. In GitHub → **Settings → Pages**:\n   - Set **Source** to “GitHub Actions”.\n\nOn each push to `main`, GitHub will:\n\n- Install dependencies\n- Run `npm run build`\n- Deploy the `_site/` folder to GitHub Pages.\n\n#### Manual or other hosts (Netlify, S3, etc.)\n\n1. Build the site:\n\n   ```bash\n   npm run build\n   ```\n\n2. Deploy the contents of `_site/` to your static host (e.g. connect Netlify to the repo with build command `npm run build` and publish directory `_site`, etc.).\n\n---\n\n### Quality assurance and validation\n\nThe project includes automated quality checks to ensure the site works correctly:\n\n#### Automated smoke tests\n\n**Smoke tests** run automatically after each build to validate that critical pages are accessible and render correctly. The testing process includes multiple validation stages:\n\n**Stage 1: Build artifact verification**\n- ✅ Verify that critical files are present in the build output (`_site/`)\n- ✅ Check for required files: `index.html`, `fr/index.html`, `en/index.html`, `CNAME`, `.nojekyll`, `404.html`\n- ✅ Verify artifact statistics (HTML file count, total size)\n\n**Stage 2: Artifact download verification**\n- ✅ Verify that the downloaded artifact contains all critical files\n- ✅ Check file sizes to ensure files were not corrupted during download\n- ✅ Validate artifact integrity\n\n**Stage 3: Local smoke tests**\n- ✅ Verify that critical pages return HTTP 200 status\n- ✅ Check that pages contain valid HTML content (title and body tags)\n- ✅ Verify CNAME file content (must be `fluance.io`)\n- ✅ Verify `.nojekyll` file presence (disables Jekyll processing)\n- ✅ Test custom 404 page handling\n- ✅ **Block deployment** if any critical page fails\n\n**Stage 4: Deployment verification**\n- ✅ Verify deployment status and page URL generation\n- ✅ Confirm successful deployment to GitHub Pages\n\n**Stage 5: Production accessibility tests (post-deploy)**\n- ✅ Wait for GitHub Pages propagation (30 seconds)\n- ✅ Test critical pages on production URL (`https://fluance.io`)\n- ✅ Verify production site accessibility and HTML validity\n- ⚠️ Note: Some tests may fail during initial propagation (can take up to 10 minutes)\n\n**Pages tested:**\n- Homepage (root, FR, EN)\n- Contact page\n- Login page (`/connexion-membre/`)\n- Online course pages (5 days, 21 days)\n- Member area (`/membre/`)\n- Custom 404 page (`/404.html`)\n- 404 error handling (non-existent page)\n\n**When smoke tests run:**\n- Automatically after each build on push to `main`\n- Before deployment (deployment is blocked if tests fail)\n- After deployment (production accessibility tests)\n\n**Viewing test results:**\n1. Go to the **Actions** tab in GitHub\n2. Click on the latest workflow run\n3. View test results in:\n   - **\"build\"** job: Artifact verification\n   - **\"smoke-test\"** job: Local smoke tests\n   - **\"deploy\"** job: Deployment status\n   - **\"post-deploy\"** job: Production accessibility tests\n\n#### Optional validation reports\n\nThe project also includes optional quality checks using **Google Lighthouse** and **W3C HTML Validator**. These reports are **not generated automatically** and can be triggered manually when needed (see [GENERER_RAPPORTS_VALIDATION.md](GENERER_RAPPORTS_VALIDATION.md) for instructions).\n\n#### Generating validation reports\n\nValidation reports are **not generated automatically** by default. To generate them:\n\n1. Go to **Actions** tab in GitHub\n2. Select **\"Deploy site to GitHub Pages\"** workflow\n3. Click **\"Run workflow\"**\n4. **Check the box** \"Exécuter les rapports Lighthouse et W3C\"\n5. Click **\"Run workflow\"**\n\nSee [GENERER_RAPPORTS_VALIDATION.md](GENERER_RAPPORTS_VALIDATION.md) for detailed instructions.\n\n#### Accessing the reports\n\nAfter running the workflow with validation enabled, reports are uploaded as GitHub Actions artifacts:\n\n1. Go to your repository on GitHub\n2. Click on the **\"Actions\"** tab\n3. Click on the latest workflow run **\"Deploy site to GitHub Pages\"**\n4. Click on the **\"validate\"** job\n5. Scroll down to the **\"Artifacts\"** section at the bottom of the page\n6. Click on **\"validation-reports\"** to download the ZIP file\n7. Extract the ZIP file to access the reports\n\n**Note:** Artifacts are retained for 30 days. After this period, they are automatically deleted.\n\n#### Report contents\n\nThe `validation-reports` artifact contains:\n\n**Google Lighthouse reports:**\n- `lighthouse-home.html` - Full Lighthouse report for the homepage (HTML format)\n- `lighthouse-fr.html` - Full Lighthouse report for the French homepage (HTML format)\n- `lighthouse-en.html` - Full Lighthouse report for the English homepage (HTML format, if available)\n- `lighthouse-home.json` - Lighthouse data for the homepage (JSON format)\n- `lighthouse-fr.json` - Lighthouse data for the French homepage (JSON format)\n\n**W3C HTML Validation reports:**\n- `w3c/` directory containing validation reports for up to 10 HTML pages\n  - Each page has both HTML and JSON format reports\n  - Files are named based on the page path (e.g., `index.html`, `fr_index.html`, `a-propos_philosophie_index.html`)\n\n**Summary:**\n- `summary.md` - Overview of available reports and how to use them\n\n#### Using the reports\n\n**Lighthouse reports:**\n- Open the HTML files in your browser for a visual, interactive report\n- Lighthouse evaluates:\n  - **Performance** - Page load speed and optimization\n  - **Accessibility** - WCAG compliance and screen reader support\n  - **Best Practices** - Security, modern web standards\n  - **SEO** - Search engine optimization\n- Use the JSON files for programmatic analysis or integration with CI/CD tools\n- Aim for scores above 90 in each category for optimal results\n\n**W3C Validation reports:**\n- Open the HTML reports to see detailed validation errors and warnings\n- The JSON format is useful for automated parsing and error detection\n- Fix any errors (marked in red) and review warnings (marked in yellow)\n- Valid HTML ensures better browser compatibility and accessibility\n\n#### Troubleshooting\n\nIf you don't see the \"Artifacts\" section:\n- Wait a few seconds after the workflow completes (upload may take time)\n- Refresh the page\n- Check the \"Upload validation reports\" step logs to verify the upload succeeded\n- Ensure the \"validate\" job completed (it may show warnings but should still generate reports)\n\nIf W3C reports are missing:\n- Check the workflow logs for the \"Validate HTML with W3C\" step\n- The reports use the local server URLs, so ensure the server started successfully\n- Some validation errors won't prevent report generation\n\n---\n\n### Environment variables\n\nThis project uses environment variables for:\n\n- **`ELEVENTY_ENV`**\n  - `dev` for local development (`npm start`)\n  - `prod` for production builds (`npm run build`)\n\n---\n\n### Maintenance\n\nTo keep the project healthy over time:\n\n- **Automatic dependency security monitoring:**\n\n  The project uses **GitHub Dependabot** to automatically monitor dependencies for security vulnerabilities and version updates.\n\n  - **Security alerts**: Dependabot automatically scans dependencies and creates pull requests for security updates\n  - **Version updates**: Weekly checks for new versions of dependencies (minor and patch updates)\n  - **Configuration**: See `.github/dependabot.yml` for monitoring settings\n  - **Notifications**: You'll receive GitHub notifications and emails for:\n    - Security vulnerabilities (high priority)\n    - Available dependency updates (weekly summary)\n  - **Pull requests**: Dependabot creates PRs automatically with:\n    - Changelog information\n    - Labels: `dependencies`, `npm`, `functions`\n    - Grouped updates for minor/patch versions\n\n  **How to use Dependabot PRs:**\n  1. Review the PR description and changelog\n  2. Test locally if needed: `git checkout \u003cdependabot-branch\u003e \u0026\u0026 npm install \u0026\u0026 npm test`\n  3. Merge the PR if everything looks good\n  4. Dependabot will automatically update `package-lock.json` and `package.json`\n\n  **Manual dependency checks:**\n\n  ```bash\n  npm outdated   # see what is out of date\n  npm update     # safe minor/patch updates\n  ```\n\n- **Automated Bexio Token Monitoring:**\n\n  The project includes a weekly check for the Bexio API token expiration to prevent service interruptions.\n\n  - **Mechanism**: A GitHub Action (`.github/workflows/bexio-token-check.yml`) runs every Monday.\n  - **Logic**: It decodes the JWT token and exits with an error if it expires within 15 days.\n  - **Notification**: GitHub automatically sends an email notification if the Action fails.\n  - **Secret required**: Ensure the `BEXIO_API_TOKEN` is added to **GitHub Repository Secrets**.\n\n- **Rebuild Tailwind and Eleventy after changes:**\n\n  - For dev: `npm start`\n  - For prod: `npm run build`\n\n- **Add new content:**\n  - French pages under `src/fr/` (Markdown or Nunjucks).\n  - Shared layouts/partials under `src/_includes/`.\n\n- **Internationalization (i18n):**\n  - The site supports **French (FR)** and **English (EN)** languages.\n  - Basic i18n is configured via `eleventy-plugin-i18n` in `eleventy.config.js`.\n  - French content is located in `src/fr/`, English content in `src/en/`.\n  - Language switching is handled in the header navigation.\n  - Each page includes `hreflang` tags for proper SEO and language targeting.\n  - You can extend the `translations` object and add new languages as needed.\n\n- **Sitemap:**\n  - A `sitemap.xml` is automatically generated during the build process.\n  - The sitemap includes all pages (excluding JSON files and 404 pages).\n  - Pages are prioritized: homepage (1.0), \"À propos\" pages (0.8), others (0.6).\n  - Multilingual pages include `hreflang` tags for proper language targeting.\n  - The sitemap is accessible at `https://fluance.io/sitemap.xml` after deployment.\n  - You can submit it to Google Search Console for better indexing.\n\n- **Open Graph (OG) Tags:**\n  - Open Graph meta tags are automatically generated for all pages to optimize social media sharing (Facebook, Twitter, LinkedIn, etc.).\n  - All OG tags are included in the base template (`src/_includes/base.njk`).\n  - **Default description**: If a page doesn't have a `description` in its frontmatter, it uses:\n    - **FR**: \"Fluance : le mouvement qui éveille et apaise. Libérez votre corps des tensions grâce à une approche simple basée sur le mouvement, le souffle et le jeu.\"\n    - **EN**: \"Fluance: the movement that awakens and soothes. Release tension from your body through a simple approach based on movement, breath and play.\"\n  - **Custom OG image**: To use a specific image for social media sharing, add `ogImage` to the page frontmatter:\n    ```yaml\n    ---\n    layout: base.njk\n    title: My Page\n    description: My page description\n    ogImage: assets/img/my-hero-image.jpg\n    ---\n    ```\n  - **Default OG image**: If `ogImage` is not specified, the default image `assets/img/fond-cedric.jpg` (homepage hero image) is used.\n  - **OG tags included**:\n    - `og:type` - Always set to \"website\"\n    - `og:url` - Canonical URL of the page\n    - `og:title` - Page title + \"| Fluance\"\n    - `og:description` - Page description (or default)\n    - `og:image` - Full URL to the OG image (1200x630 recommended)\n    - `og:image:width` and `og:image:height` - Image dimensions\n    - `og:locale` - Language locale (fr_FR or en_US)\n    - `og:locale:alternate` - Alternate language version\n    - `og:site_name` - \"Fluance\"\n  - **Twitter Card tags** are also included for optimal Twitter sharing:\n    - `twitter:card` - Set to \"summary_large_image\"\n    - `twitter:url`, `twitter:title`, `twitter:description`, `twitter:image`\n  - **Image URL generation**: The `buildOgImageUrl` filter automatically converts relative image paths to full URLs (`https://fluance.io/...`).\n  - **Testing**: Use Facebook's [Sharing Debugger](https://developers.facebook.com/tools/debug/) or Twitter's [Card Validator](https://cards-dev.twitter.com/validator) to preview how your pages appear when shared.\n\n- **Schema.org JSON-LD:**\n  - Structured data markup is automatically generated for all pages to improve SEO and enable rich results in search engines.\n  - The `schemaOrg` shortcode in `eleventy.config.js` generates appropriate schemas based on page type.\n  - **Schemas included:**\n    - **Organization** (all pages): Information about Fluance / Instants Zen Sàrl, address, contact, social media\n    - **WebSite** (all pages): Site information with SearchAction for search functionality\n    - **Person** (all pages): Information about Cédric Vonlanthen (founder/instructor)\n    - **Service** (homepage only): Description of wellness services and offers\n    - **Course** (online course pages): Course information, pricing, descriptions, languages\n    - **LocalBusiness** (in-person class pages): Information about classes in Fribourg, address, coordinates, pricing\n  - **Multilingual support**: Schemas automatically adapt to page language (FR/EN).\n  - **Security**: Email is not included in schemas to prevent spam scraping (phone number is used instead).\n  - **Validation**: Test your structured data with Google's [Rich Results Test](https://search.google.com/test/rich-results).\n  - Schemas are included in the `\u003chead\u003e` of every page via `src/_includes/base.njk`.\n\n- **llms.txt:**\n  - A structured file (`llms.txt`) is available at the root of the site to help Large Language Models (LLMs) better understand and reference the site.\n  - **Purpose**: Improves how AI assistants (ChatGPT, Claude, Perplexity, etc.) understand and recommend Fluance in their responses.\n  - **Content**: Includes site description, main sections with links, services, pricing, contact information, and approach characteristics.\n  - **Location**: The file is located at `src/llms.txt` and is automatically copied to the site root during build.\n  - **Access**: Available at `https://fluance.io/llms.txt` after deployment.\n  - **Focus**: Content-oriented information for users, without technical implementation details.\n\n- **Static assets:**\n  - Add images, icons, etc. under `src/assets/img/`.\n  - They are copied to `_site/assets/img/` via `eleventyConfig.addPassthroughCopy`.\n  - **WebP optimization**: For better performance, convert images to WebP format and place them alongside the original files (e.g., `image.jpg` and `image.webp`). The `image` shortcode automatically serves WebP when available, with fallback to the original format.\n  - **Image shortcode usage**: Use `{% image \"assets/img/filename.jpg\", \"alt text\", \"classes\", \"loading\", \"fetchpriority\", \"width\", \"height\" %}` in templates. Always provide width and height to prevent layout shifts.\n\n---\n\n### Security and secrets\n \n - **Dependency security**: Automated monitoring via GitHub Dependabot (see [Maintenance](#maintenance) section)\n - **Secrets management**: No API keys or secrets are committed to the repository.\n - **Frontend Environment variables**: The site uses environment variables for Firebase and Stripe configuration. These are loaded from a local `.env` file during development and from **GitHub Repository Secrets** during deployment.\n - **Backend Environment variables**: Firebase Functions use environment variables configured via the Firebase Console (see `CONFIGURATION_VARIABLES_ENV.md`).\n - **Git ignore**: The `.gitignore` file correctly excludes `.env` and other sensitive files.\n - **Security alerts**: Check the **Security** tab in GitHub for active security advisories.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedric-v%2Ffluance-io","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcedric-v%2Ffluance-io","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedric-v%2Ffluance-io/lists"}