#llmsmap.me

Audit technique indépendant

vibetuner.alltuner.com

vibetuner.alltuner.com

Score global de préparation IA

Résultat combiné de tous les signaux de l’audit.

64sur 100Moyen
Audit de préparation IA: 26/08/2026Données techniques publiques

Évaluation globale de préparation IA

Niveau de préparation de vibetuner.alltuner.com pour les systèmes d’IA

64/100

Vibetuner (vibetuner.alltuner.com) a obtenu 64/100 lors de l’audit technique automatisé de préparation à l’IA. llms.txt était accessible, llms-full.txt était accessible et ai.txt était introuvable. L’analyse de robots.txt a trouvé 0 robots IA explicitement autorisés, 0 bloqués et 0 sitemaps déclarés. La complétude du balisage de la page d’accueil atteint 0% ; aucun type Schema.org détecté. Balises OpenGraph détectées : 0. Les résultats correspondent aux réponses publiques observées le 2026-08-26T03:07:24.568Z.

Contexte de l’évaluation

L’audit combine les fichiers lisibles par les machines, les règles des robots, les sitemaps et le balisage de la page d’accueil. llms.txt est accessible et contient 4 879 jetons.

robots.txt est disponible ; robots IA bloqués : 0. Sitemaps déclarés : 0. Aucun type Schema.org détecté.

Profil Lighthouse mobile : performance 67/100, accessibilité 89/100, SEO 100/100.

Points forts confirmés

  • llms.txt est accessible
  • llms-full.txt est disponible
  • robots.txt a été analysé
  • Les signaux OpenGraph et canoniques ont été vérifiés

Améliorations prioritaires

  1. 1Déclarer le sitemap.xml actuel dans robots.txt.
  2. 2Ajouter du JSON-LD pour l’organisation, le site et les entités principales.
Jetons llms.txt4 879
Jetons llms-full.txt30 793
ai.txt
sitemap.xml

Profil technique Google Lighthouse

Une mesure Lighthouse mobile. La catégorie expérimentale Agentic Browsing est présentée séparément et ne remplace pas le score global de LLMSMap.

Mobile · Lighthouse
67

Performance

89

Accessibilité

96

Bonnes pratiques

100

SEO technique

67

Agentic Browsing

Interprétation des résultats

La performance mobile est de 67/100 ; le plus grand contenu visible est apparu en 9.3 s et le thread principal a été bloqué pendant 0 ms. Le décalage de mise en page est de 0. Les tâches longues retardent les actions des utilisateurs et des agents de navigateur.

Accessibilité : 89/100, bonnes pratiques : 96/100, SEO technique : 100/100. La catégorie expérimentale Agentic Browsing atteint 67/100 et reste distincte du score global de LLMSMap.

1

Libérer le thread principal et accélérer le premier écran

Découpez les longues tâches JavaScript, différez les scripts et styles non critiques et réduisez les chaînes de requêtes bloquantes.

2

Réduire le code chargé inutilement

Supprimez le CSS et le JavaScript inutilisés, chargez les widgets lourds à la demande et limitez les scripts tiers.

3

Optimiser les images et leur ordre de chargement

Servez des formats modernes adaptés, donnez la priorité au visuel principal et chargez tardivement le contenu sous la ligne de flottaison.

4

Réduire la latence réseau

Améliorez la réponse du serveur, retirez les redirections inutiles et utilisez la compression et le cache.

FCP3.1 s

Premier contenu

LCP9.3 s

Contenu principal

CLS0

Stabilité visuelle

TBT0 ms

Temps de blocage

SI4.7 s

Vitesse visuelle

Glossaire des métriques
FCP · Premier contenu
Moment où le premier texte ou la première image apparaît.
LCP · Contenu principal
Moment où le plus grand élément visible est affiché.
CLS · Stabilité visuelle
Déplacements inattendus pendant le chargement ; une valeur basse est préférable.
TBT · Temps de blocage
Durée pendant laquelle le thread principal ne pouvait pas répondre rapidement.
SI · Vitesse visuelle
Vitesse à laquelle la zone visible s’est remplie de contenu.
26/08/2026Lighthouse 13.4.1Profil mobile

Vérifications de préparation IA

Fichiers lisibles par les machines, règles des robots, découverte et balisage de la page d’accueil.

llms.txt

Fichier trouvé et accessible

https://vibetuner.alltuner.com/llms.txt
llms-full.txt

La version complète est disponible

https://vibetuner.alltuner.com/llms-full.txt
ai.txt

Le fichier ai.txt est introuvable

Sitemap dans robots.txt

Aucun sitemap déclaré dans robots.txt

Schema.org (JSON-LD)

Aucun balisage Schema.org trouvé sur la page d’accueil

OpenGraph0%

Aucune balise OpenGraph trouvée sur la page d’accueil

Accès des robots IA

D’après l’analyse de robots.txt

GPTBotNon mentionné
OAI-SearchBotNon mentionné
ChatGPT-UserNon mentionné
Google-ExtendedNon mentionné
ClaudeBotNon mentionné
Claude-SearchBotNon mentionné
Claude-UserNon mentionné
BytespiderNon mentionné
CCBotNon mentionné
PerplexityBotNon mentionné
Perplexity-UserNon mentionné
# Vibetuner

> Vibetuner is a production-ready FastAPI project scaffolding tool that generates full-stack web applications with authentication, flexible database support (MongoDB or SQL), frontend, Docker deployment, and CLI tools pre-configured in seconds. Built by All Tuner Labs for rapid iteration and modern development.

Important notes:

- Vibetuner consists of four packages: a Python framework (`vibetuner`), a JavaScript build-deps package (`@alltuner/vibetuner`) which bundles tailwind, daisyui, htmx and an npm-shipped mirror of the framework's jinja templates (`@alltuner/vibetuner-jinja`, pulled in as a transitive — consumers don't install it directly), and a Copier scaffolding template
- The framework separates immutable framework code (`vibetuner` package) from your application code (`src/app/`) for clean updates
- In all examples, `app` refers to your project's Python package (the directory under `src/`). The actual name depends on your project slug (e.g., `src/myproject/` for a project named "myproject")
- HTMX is used instead of React/Vue for simplicity - server-rendered HTML with sprinkles of interactivity
- All tools are chosen for speed: uv (Python), bun (JavaScript), Granian (ASGI server), Ruff (linting)
- The project is designed to work excellently with AI coding assistants like Claude, Cursor, and ChatGPT

## Quick Start

- [Quick Start Guide](https://vibetuner.alltuner.com/quick-start/): Get started with Vibetuner in 5 minutes
- [Installation](https://vibetuner.alltuner.com/installation/): Prerequisites and installation options
- [Your First Project](https://vibetuner.alltuner.com/quick-start/#create-your-first-project): Interactive project setup with `uvx vibetuner scaffold new`

## Core Documentation

- [Development Guide](https://vibetuner.alltuner.com/development-guide/): Daily development workflow, adding routes, models, templates, and background jobs
- [Architecture](https://vibetuner.alltuner.com/architecture/): System design, four-package architecture, request flow, and core components
- [Tech Stack](https://vibetuner.alltuner.com/tech-stack/): Detailed information about all technologies used and why they were chosen
- [Authentication](https://vibetuner.alltuner.com/authentication/): OAuth and magic link authentication setup and configuration, plus built-in hardening: `SESSION_KEY` fails closed in production while the shipped placeholder is unchanged (`vibetuner crypto generate-key`), auth endpoints carry a per-IP rate limit (`RATE_LIMIT_AUTH_LIMITS`, default `5/minute`), and post-login redirects (`next`/`current`) are validated against open redirects
- [Background Tasks](https://vibetuner.alltuner.com/background-tasks/): Background task system powered by Streaq and Redis with retries, cron scheduling, and SSE integration
- [Runtime Configuration](https://vibetuner.alltuner.com/runtime-config/): Layered configuration system with MongoDB persistence, debug UI, and feature flags
- [Upgrading](https://vibetuner.alltuner.com/upgrading/): General upgrade workflow — `vibetuner scaffold update` for template changes, `uv add vibetuner@latest` for framework bumps, semver policy, and links to version-specific migration guides
- [Upgrading to v12](https://vibetuner.alltuner.com/upgrading-to-v12/): v11 → v12 breaking changes — fail-closed `SESSION_KEY` guard (`vibetuner crypto generate-key`), Jinja autoescaping in the static-render path, and a `5/minute` default auth rate limit (`RATE_LIMIT_AUTH_LIMITS`)
- [HTMX v2 to v4 Migration](https://vibetuner.alltuner.com/htmx-migration/): Breaking changes and migration guide for upgrading from HTMX v2 to v4
- [Troubleshooting](https://vibetuner.alltuner.com/troubleshooting/): `vibetuner doctor` diagnostic command — what it checks, how to read output, and common issue resolutions
- [Theming](https://vibetuner.alltuner.com/theming/): Build-time brand palette via cascade override of DaisyUI's `[data-theme="…"]` selectors in `config.css` (no consumer-side `daisyui` dep needed), a CSP-nonced no-flash light/dark/system setter (`base/theme_init.html.jinja`) that sets `data-theme` before first paint and exposes `window.cycleTheme()`, plus runtime per-tenant overrides via the embedded `TenantTheme` model + opt-in `register_tenant_theme_provider()` helper + shipped `base/theme.html.jinja` partial that injects DaisyUI role-color overrides at request time

## Features

- **HTMX Request Detection**: `request.state.htmx` available on every request.
  Properties: `.boosted`, `.target` (`tag#id`), `.source` (`HX-Source`; the htmx 2
  request `HX-Trigger`), `.request_type` (`"full"`/`"partial"`), `.current_url`,
  `.history_restore_request`, `.prompt` (via the `hx-prompt` extension). Use
  `require_htmx` dependency from `vibetuner` to reject non-HTMX requests with 400
- **CRUD Factory**: `create_crud_routes()` generates list/create/read/update/delete
  endpoints for Beanie models with pagination, filtering, sorting, and search
- **SSE Helpers**: `@sse_endpoint()` and `broadcast()` for real-time streaming with
  HTMX. Import from `vibetuner`. Redis pub/sub for multi-worker support
- **`@render` Decorator**: `@render("template.html.jinja")` eliminates
  `render_template()` boilerplate — route returns a dict, decorator handles rendering.
  Returns `Response` objects unchanged (escape hatch). Import from `vibetuner`
- **Streaming HTML**: `render_template_stream()` returns a `StreamingResponse` using
  Jinja2's `generate()`, improving TTFB for large pages. Same context merging as
  `render_template()`. Import from `vibetuner`
- **Block Rendering**: `render_template_block(template, block_name, request, ctx)`
  renders a single `{% block %}` for HTMX partials. `render_template_blocks()` renders
  multiple blocks for OOB swaps. No extra dependencies. Import from `vibetuner`
- **Context kwarg**: `render_template*` accepts the user context positionally, as
  `ctx=`, or as `context=` (alias for `ctx=`). Passing both, or any unknown kwarg,
  raises `TypeError` — typos cannot silently render with an empty context
- **`@cache` Decorator**: `@cache(expire=60)` caches route responses in Redis.
  Key derived from path + query params. Use `vary_on=lambda r: str(r.state.user.id)`
  for request-dependent keys (per-user, per-tenant). Disabled in debug mode
  (override with `force_caching=True`). No-op if Redis unavailable.
  `invalidate(path, query_params=..., vary=...)` deletes one exact entry
  (pass `vary` to hit a `vary_on` variant); `invalidate_pattern(path)` removes
  every variant of a path (or a glob match) via per-path key registries —
  no keyspace SCAN. Import from `vibetuner.cache`
- **`@cache_control` Decorator**: `@cache_control(max_age=300, public=True)` sets
  `Cache-Control` headers declaratively. Supports `public`, `private`, `no_cache`,
  `no_store`, `max_age`, `s_maxage`, `must_revalidate`, `stale_while_revalidate`,
  `immutable`. Import from `vibetuner.decorators`
- **HTMX Response Helpers**: `hx_redirect()`, `hx_location()`, `hx_trigger()`,
  `hx_push_url()`, `hx_reswap()`, `hx_retarget()`, `hx_refresh()`,
  `hx_replace_url()`. Handles JSON serialization internally. Import from
  `vibetuner.htmx`
- **HTMX Error-Swap Default**: the skeleton ships
  `<meta name="htmx-config" content='{"noSwap": [204, 304, "4xx", "5xx"]}'>`,
  so 4xx/5xx response bodies are not swapped into the target (htmx 2 behavior)
  — a stray `422` never replaces a fragment with an error page. Opt a specific
  element back in with `hx-status:<code>` (wins over the wildcards). Override
  the `htmx_config` block to customize; keep `noSwap`
- **Built-in Template Globals**: `request`, `language`, `DEBUG`, `now`
  (UTC datetime), `today` (ISO date string), `project` (`settings.project`),
  `brand` (`settings.brand`), `csp_nonce`, and `hotreload` are available
  in all templates automatically
- **Skeleton Extension Points**: `base/skeleton.html.jinja` exposes blocks
  (`extra_head_links`, `extra_scripts`, `before_main`, `after_main`) and
  context variables (`color_scheme`, `canonical_url`, `font_preloads`) so
  projects can extend instead of wholesale-overriding the skeleton —
  upstream changes (CSP nonce, theming, etc.) flow through automatically
- **Brand Configuration**: `BRAND_PRIMARY_COLOR`, `BRAND_BROWSER_THEME_COLOR`,
  `BRAND_EMAIL_BUTTON_COLOR` env vars drive favicon meta tags, the PWA
  manifest's `theme_color`/`background_color`, and the magic-link email button
  — surfaces where DaisyUI/CSS-variable theming can't reach (favicon meta
  is read before CSS runs; email clients ignore CSS variables). Accepts
  pydantic-Color inputs (named, `rgb()`, hex). For per-tenant in-page
  colors use `TenantTheme`; `BrandSettings` is deliberately app-level
- **Encrypted Fields**: `EncryptedFieldsMixin` and `EncryptedStr` type for
  transparent Fernet encrypt-on-save / decrypt-on-load on any Beanie model field.
  Import from `vibetuner.models.mixins`. Requires `FIELD_ENCRYPTION_KEY` env var
- **Template Context Providers**: `register_globals()` and `@register_context_provider`
  inject variables into every template render
- **Per-Tenant Theming**: `TenantTheme` embedded model (`vibetuner.models.TenantTheme`)
  with eight optional `#rrggbb` fields for DaisyUI role / role-content colors plus
  `.overrides()` for the `{css_var: hex}` map. Wire it up with
  `register_tenant_theme_provider(getter)` from `vibetuner` — opt-in, runs on every
  render, fail-soft. Vibetuner's `base/skeleton.html.jinja` already includes
  `base/theme.html.jinja`, which emits a CSP-noncified `<style>:root { ... }</style>`
  block after `bundle.css`. `bundle.css` stays tenant-agnostic and cached
- **i18n Primitives**: `vibetuner.i18n` ships
  `register_locale_resolver(getter, *, priority=0)` to inject custom selectors
  at the front of `LocaleMiddleware`'s chain (per-tenant locale becomes a
  one-liner), `set_request_language(request, code)` to update both the Babel
  context and `request.state.language` in one call, and `language_picker(display_locale=None)`
  returning `[{code, name}]` with names rendered in the current request's locale
  (browsing in Spanish gives "inglés / español / catalán"; never English-only).
  `language_picker` is also registered as a Jinja global so templates can call
  it directly without overriding any existing template variable. The
  Accept-Language selector (`LocaleFromAcceptLanguage` / `negotiate_accept_language`)
  negotiates region-aware with language-only subtag fallback, so a region-qualified
  top preference (`ca-ES`) resolves to supported `ca` instead of losing to a
  lower-ranked exact match (`es`)
- **Framework Translation Catalogs**: vibetuner ships compiled
  `.mo` files under `vibetuner/locales/<lang>/LC_MESSAGES/messages.mo`
  (currently `en`, `ca`). `frontend/middleware.py` loads them before the
  project's own `locales/` so framework templates (`login.html.jinja`,
  `user/profile.html.jinja`, etc.) render in the active locale with no
  per-app extraction. App catalogs loaded after the framework override
  framework strings on collision via gettext domain merging. Add a new
  framework locale with `just new-framework-locale <code>` then
  `just compile-framework-locales`
- **Service DI**: `get_email_service()`, `get_blob_service()`, `get_runtime_config()`
  FastAPI dependency wrappers
- **Email Providers**: Pluggable transactional email via Resend
  (`MAIL_RESEND_API_KEY`), Mailjet (`MAIL_MAILJET_API_KEY` +
  `MAIL_MAILJET_API_SECRET`), or Cloudflare Email Service
  (`MAIL_CLOUDFLARE_API_TOKEN` + `MAIL_CLOUDFLARE_ACCOUNT_ID`). Auto-detected
  from available credentials; `MAIL_PROVIDER=resend|mailjet|cloudflare` to
  pick explicitly. Auto-detection priority: resend > mailjet > cloudflare.
  Resend caps sends at 5 req/s plus a monthly quota; on HTTP 429 the provider
  raises `RateLimitError` (no retry/queue) and logs a `WARNING` with the
  `ratelimit-*`/`x-resend-monthly-quota` headers, which are logged at `DEBUG`
  on every send
- **CSP Nonce Auto-Injection**: `SecurityHeadersMiddleware` generates a unique CSP nonce
  per request and auto-injects it into all `<script>` tags in HTML responses. Do NOT
  manually add `nonce=` attributes to `<script>` tags in templates, the middleware handles
  this automatically. For `<style>` tags or other elements that need the nonce, use the
  `{{ csp_nonce }}` template variable (available in all templates via context provider).
  CSP is enforced in both production and debug mode by default so violations break the
  page locally; set `CSP_ENFORCE_CSP_IN_DEBUG=false` to fall back to
  `Content-Security-Policy-Report-Only` in debug. Configure extra sources via `CSP_*`
  environment variables (e.g., `CSP_EXTRA_SCRIPT_SRC`). Set `CSP_STYLE_SRC_STRICT=true`
  to drop `'unsafe-inline'` from `style-src` and require nonces on `<style>` tags
  (opt-in hardening; framework templates already nonce every `<style>`). Requires
  `vibetuner` ≥ 10.11.0 (older releases silently ignore the env var). When an OAuth
  provider (Google, GitHub) is enabled and has credentials configured, its avatar CDN
  host is added to `img-src` automatically — no `CSP_EXTRA_IMG_SRC` entry needed for
  OAuth provider profile pictures. The middleware also pairs nosniff with a
  `text/plain; charset=utf-8` fallback when a response has no `Content-Type` (e.g. a
  bare `Response(status_code=404)`), so bare responses do not get turned into 0-byte
  browser downloads (Safari/Firefox) or generic error pages (Chrome)
- **htmx CSP Protection (default-on)**: htmx 4.0.0-beta4 ships an `hx-csp` extension
  (renamed from `hx-nonce` in beta3) that gates htmx attribute processing behind the
  page CSP nonce. It is loaded by default from the framework-managed block of
  `config.js` (`import "@alltuner/vibetuner/htmx/csp";`, alongside `hx-preload` /
  `hx-live`), and it is what makes `hx-on:` / `hx-live` work at all under vibetuner's
  strict `script-src 'nonce-…' 'strict-dynamic'` (no `'unsafe-eval'`): the import also
  flips `htmx.config.safeEval = true` so htmx evaluates those expressions via
  nonce-based `<script>` injection instead of `new Function()` (which the nonce +
  `strict-dynamic` CSP would reject with an `EvalError`). The extension is fail-closed —
  any element carrying an `hx-*` attribute needs a matching `hx-nonce` — but
  `SecurityHeadersMiddleware` auto-stamps `hx-nonce` on every htmx element (the same
  way it injects the `nonce` into `<script>` tags), so no manual stamping, no
  `body_attrs` nonce, and no `safeEval` meta tag are required. Because the gate trusts
  whatever the server renders, projects that render untrusted HTML (markdown,
  user-supplied content) must still sanitize it. The HTML attribute is still named
  `hx-nonce`; only the extension was renamed
- **htmx Live Reactivity (default-on)**: htmx 4's `hx-live` extension is
  loaded by default from `config.js` since `@alltuner/vibetuner` 10.15.0. Use
  `hx-live="<expr>"` for derived state that recomputes on any DOM mutation,
  `hx-on:event="..."` with the `q()` proxy / sigil-`toggle()` / per-element
  `debounce()` for richer event handlers. CSP-safe (the default-on `hx-csp`
  extension's `safeEval` evaluates them via nonce-based script injection) where raw
  inline `onclick=` is not. Vibetuner's preferred path for chip lists, paired
  controls, live filters, and inline form-field validation — use this before
  reaching for Alpine.js or Stimulus.
  See `vibetuner-docs/docs/htmx-migration.md#live-reactivity-with-hx-live` for
  idiomatic patterns and rough edges
- **Health Checks**: `/health`, `/health/ping`, `/health/ready`, `/health/id` endpoints
  with service connectivity checks
- **Robust Tasks**: `@robust_task()` decorator with exponential backoff retries and
  MongoDB dead letter collection
- **Robust Cron**: `@robust_cron("*/15 * * * *")` decorator combines scheduled
  execution with the same retry/dead letter support as `@robust_task()`.
  Import from `vibetuner.tasks.robust`
- **Streaq UI**: Task queue monitoring dashboard at `/debug/tasks`. `/queue`
  and `/workers` carry a 5s request timeout (Redis SCAN can be slow on shared
  instances); on expiry the server renders a "Task queue unavailable" page
  with an operator checklist (worker / Redis / streaq version) and a retry
  link, or returns a `streaq_debug_timeout` JSON payload for API clients
- **Doctor CLI**: `vibetuner doctor` validates project setup, services, and config
- **Config Decorators**: `@config_value()` and `ConfigGroup` for type-safe runtime
  configuration. `set_config(key, value)` persists values programmatically.
  `VibetunerApp(runtime_config={...})` for declarative registration in `tune.py`
- **Config CLI**: `vibetuner config list|set|delete` manages runtime config
  values from the command line. Secret values use hidden input prompts
- **Config Env Fallback**: Runtime config keys auto-resolve from environment
  variables derived as `<KEY>.upper().replace(".", "_")` (e.g.
  `services.anthropic_api_key` → `SERVICES_ANTHROPIC_API_KEY`). Priority is
  runtime override > MongoDB > env var > registered default. `.env` /
  `.env.local` are honored. `/debug/config/<key>` renders a "Set this value"
  block on secret keys showing the env-var name, CLI command, and `.env`
  entry, with a worker/frontend restart reminder
- **Testing Fixtures**: `vibetuner_client`, `mock_auth`, `mock_tasks`,
  `override_config`, `vibetuner_db` pytest fixtures. Set `TEST_MONGODB_URL` to
  run the suite against a local Mongo while `MONGODB_URL` stays pointed at prod;
  `TEST_REDIS_URL` does the same for Redis (rate limiter, cache, pub/sub)
- **Error Messages**: Actionable error messages with env var examples, Docker
  commands, and documentation links
- **Docker Builds**: Production Docker image builds (linux/amd64) via
  `just release` using `compose.prod.yml` bake configuration. Optional GitHub
  Actions workflow for self-hosted runners (enabled via
  `use_self_hosted_runner` scaffold prompt)

## Reference

- [CLI Reference](https://vibetuner.alltuner.com/cli-reference/):
  Commands for `vibetuner scaffold`, `vibetuner run`, `vibetuner db`,
  `vibetuner doctor`, `vibetuner config`, `vibetuner debug`, `vibetuner crypto`,
  and `vibetuner version`
- [Scaffolding Reference](https://vibetuner.alltuner.com/scaffolding/):
  Template prompts, post-generation tasks, and updating existing projects
- [Deployment](https://vibetuner.alltuner.com/deployment/):
  Docker production builds, environment configuration, and deployment options

## Development

- [Contributing Guidelines](https://vibetuner.alltuner.com/contributing/): How to contribute, code style, and PR title format (uses conventional commits)
- [Development Workflow](https://vibetuner.alltuner.com/development/): Setting up the development environment for contributing to Vibetuner itself
- [Changelog](https://vibetuner.alltuner.com/changelog/): Version history and release notes

## Packages

- [Python Package](https://pypi.org/project/vibetuner/): Core framework published to PyPI
- [JavaScript Package](https://www.npmjs.com/package/@alltuner/vibetuner): Frontend build dependencies published to npm
- [Tailwind Source Package](https://www.npmjs.com/package/@alltuner/vibetuner-jinja): npm-shipped mirror of the framework's frontend jinja templates, pulled in transitively by `@alltuner/vibetuner` so tailwind can `@source` them at frontend build time without shelling out to Python
- [Repository](https://github.com/alltuner/vibetuner): Source code and issue tracking
Partager ou poursuivre l’analyse
Partager cet audit
Discuter avec une IA
Ajouté 26/08/2026
vibetuner.alltuner.com – audit de préparation IA | llmsmap.me/fr