Clicking a plugin inside a marketplace (e.g. commit-commands in
claude-plugins-official) now opens a modal listing its actual
commands/agents/skills with names and descriptions, instead of just a
count badge. Also adds a live search box to filter plugins within a
marketplace page.
generate_plugins_json.py now fetches each component file's frontmatter
description (bounded by max_local_scans=50 locally-sourced plugins per
marketplace) and stores it in components_items, consumed by the new
MarketplacePluginsList.tsx island.
- Add TR flag to CountryFlag.tsx so Turkey renders correctly in the
trending "Top Countries" list instead of falling back to the generic
placeholder icon.
- Wrap the "Promote your component" button on mobile so it no longer
overflows the Featured Integrations card.
- Fix Vercel/Anthropic footer icons being invisible in dark mode: they
relied on currentColor (which doesn't apply to <img> sources) and on
Tailwind's dark: variant, which is media-query based here while the
site's theme is toggled via a class on <html>. Now fetch fixed white
icons and invert them under html.light via a dedicated oss-icon class.
Filter toolbar (search/category/filters/sort) wrapped awkwardly on mobile,
leaving the sort dropdown orphaned to the right via ml-auto. Featured
integrations grid jumped from 1 to 3 columns right at the md breakpoint,
cramming card text. The mobile hamburger button also sat flush against
the search input with no gap.
Placeholder while the logo gets a proper redesign — swaps the pink
"AITMPL" image for a minimal terminal-style icon (>_) matching the site's
mono/terminal aesthetic and accent color, instead of leaving it blank.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The mobile hamburger button called toggleSidebar(), a function that was
never defined anywhere — a silent ReferenceError, so the button did
nothing. The sidebar itself was also `hidden` on mobile with no mechanism
to show it at all.
- Implements toggleSidebar() as a real slide-in drawer with a dark overlay
(closes on overlay tap, on navigating to a link, or on resize to desktop
width). Desktop collapse-to-icons behavior is untouched.
- Fixing the drawer surfaced a pre-existing horizontal overflow bug on
mobile (previously invisible since the sidebar never rendered): the
filter toolbar in ComponentGrid.tsx (search + category + sort) was a
flex row with no wrap, forcing the whole page to scroll horizontally
and clip content on narrow viewports. Added flex-wrap plus min-w-0/
min-w on the flex children so they stack instead of overflowing, and
min-w-0 on #main-content + overflow-x-hidden on <body> as defense in
depth against the same class of bug elsewhere.
Confirmed via browser console (scrollWidth > clientWidth check) that no
element overflows the mobile viewport after the fix.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Companies wanting to pay for a promoted slot need a way to apply. Adds a
button-style link next to the section title pointing to the public Google
Form (aitmpl.com Ads), styled with the site's accent color so it's visible
enough to notice — an earlier plain-text version was nearly invisible.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds free-tier Sentry error reporting to close the biggest observability
gap: automated cron/worker failures were previously invisible (aitmpl-crons
had no error handling at all). Uses a dependency-free fetch()-based Sentry
envelope client (cloudflare-workers/*/sentry.js, dashboard error-tracking.ts,
cli-tool error-reporting.js) instead of the official SDKs, to keep the
zero-dependency worker style and avoid Cloudflare Pages SSR friction.
- Cloudflare Workers: report failures + Cron Monitor check-ins in crons,
pulse, and docs-monitor (complementing, not replacing, existing Telegram
alerts). Also drops the pulse Vercel collector (VERCEL_API/collectVercel),
since the dashboard no longer deploys to Vercel.
- Dashboard: captureApiError() wired into claude-code-check, health-check,
and the three track-* endpoints.
- CLI: opt-in only crash reporting (CCT_ERROR_REPORTING=true), always
deferring to the existing CCT_NO_TRACKING/CCT_NO_ANALYTICS/CI opt-outs.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The dashboard is on Cloudflare Pages with a 24h edge cache already in
place, but every island still downloaded the full ~1.9MB index (327KB
gz) — even the sidebars/plugins/collection pages that only need per-type
counts. This splits the index into purpose-built artifacts so the
browser fetches only what each surface needs.
Generator (scripts/generate_components_json.py):
- Decouple the docs and dashboard index writes (they were a byte copy).
docs/components.json keeps `security` (the legacy site renders it);
the dashboard index drops both `content` and `security` (unused there)
→ ~13% smaller.
- Emit dashboard/public/counts.json (per-type counts, ~150 bytes),
components/{type}.json (per-type slices), and search-index.json
(flat name/description/category/type/path for global search).
Dashboard islands:
- ComponentGrid loads only the active type via fetchComponentsByType,
re-fetching on type switch (per-type in-memory cache).
- SearchModal (Cmd+K) uses the lighter search-index.json.
- Sidebar + plugins index/detail + collection pages fetch counts.json
instead of the full index just to read array lengths.
- data.ts gains fetchComponentsByType/fetchSearchIndex (additive);
fetchComponents() stays for the SSR detail page and Discord bot.
Fix: SendToRepoModal read `match.content` off an index that no longer
carries content, so "Send to repo" produced empty PRs / threw "No
component content found". buildFileMap now pulls each item's content via
fetchComponentContent (the per-component files), which also removes its
full-index fetch.
_headers: cache/CORS blocks for counts.json, components/*, search-index.json.
Payload (gzip on-the-wire): sidebars/plugins/collection 327KB → ~124B;
grid default type (agents) 327KB → 145KB; Cmd+K 327KB → 260KB.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: add Loops component type with referenced components
Introduce "loops" as a new first-class component type — autonomous
agentic workflows (goal + interval + stop condition) inspired by Loop
Engineering and the Forward Future Loop Library. A loop references other
components (agents, skills, hooks, commands) and the dashboard renders
those references as clickable cards on the loop detail page.
- Add 10 starter loops under cli-tool/components/loops/
(engineering, evaluation, operations)
- Catalog generator: scan loops + write per-component content files
- Dashboard: new type in icons/types/data, /loops page, and a
"Referenced Components" section on the loop detail page
- CLI: --loop flag installs the loop to .claude/loops/ and
auto-installs its referenced components
- Docs: CLAUDE.md and cli-tool rule updated
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T9ynMiCHt8JwdMd8KjCkES
* feat: add 8 more loops (goal/loop/schedule patterns)
Expand the loops catalog to 18, drawing ideas from community "Loop
Engineering" patterns. Adds loops across the three trigger verbs
(/goal, /loop, /schedule) and emphasizes the verifier-in-the-loop and
budget / anti-spin guardrails:
- engineering/five-minute-maintainer-loop
- engineering/build-test-fix-loop
- engineering/anti-spin-build-loop
- engineering/completion-contract-loop (goal)
- engineering/goal-refiner-loop (goal)
- engineering/adversarial-review-loop (cross-model)
- operations/overnight-pr-routine-loop (schedule)
- evaluation/human-approval-loop (human-in-the-loop)
All referenced components verified to exist; catalog regenerated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T9ynMiCHt8JwdMd8KjCkES
---------
Co-authored-by: Claude <noreply@anthropic.com>
- logo.png → logo.webp: 95 KB → 11 KB (−88%)
- claude-code-logo.png → claude-code-logo.webp: 26 KB → 9.6 KB (−63%)
- braingrid-logo.png → braingrid-logo.webp: 17 KB → 7.6 KB (−55%)
- <picture> con fallback PNG para compatibilidad en Sidebar, index, JobsView
- fetchpriority="high" en el logo del Sidebar (LCP element en todas las páginas)
- <link rel="preload"> del logo.webp en el <head> para adelantar la descarga
- loading="lazy" en logos below-the-fold (JobsView)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Split components.json: índice sin content (1.9 MB / 249 KB br vs 15.6 MB / 4.15 MB br).
Generador produce component-content/{type}/{slug}.json por componente y auto-copia
a dashboard/public/. Página de detalle carga contenido on-demand via fetchComponentContent().
- Restaurar cabeceras de caché y seguridad perdidas en la migración Vercel→Cloudflare:
_headers con Cache-Control max-age=86400 para JSONs, immutable para _astro/*,
y HSTS, X-Frame-Options, Referrer-Policy, Permissions-Policy en todas las rutas.
- Eliminar dashboard/vercel.json (config muerta desde migración a Cloudflare Pages).
- Diferir hidratación: ClerkIsland y AuthButton client:load → client:idle;
SaveToCollectionButton → client:visible.
- Eliminar gpt-tokenizer del bundle del navegador: reemplazado por estimación chars/4.
- Actualizar .claude/rules/dashboard.md para reflejar hosting en Cloudflare Pages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Mueve Jobs Using Claude Code a panel vertical sticky en el lado derecho
(260px, visible en xl+, scroll independiente, hasta 12 jobs)
- Quita la sección horizontal de jobs del flujo principal para llegar
directo al grid de componentes al cargar
- Grid de componentes: 2 cols en xl, 3 cols en 2xl (corrige cards estrechos)
- Hero ASCII: logo claude-code-logo.png al lado del texto, centrado
- ASCII art y logo más grandes, sin scroll horizontal
- Subtítulo centrado con punto de estado verde
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Paleta GitHub-dark (#0d1117 / #161b22 / #21262d, borde #30363d)
- Acento naranja #d57455 + verde terminal #3fb950 para badges/dots
- Banner ASCII-art naranja con punto de estado verde pulsante en hero
- Bordes nítidos con hover naranja en cards (sin scale ni sombras pesadas)
- Prompt > y cursor de bloque en barra de búsqueda del TopBar
- Títulos de cards y labels de sidebar en monospace (font-ui-mono)
- Badges de descargas en pill verde (.badge-download)
- Barra activa del sidebar en naranja en vez de indigo
- Esquinas más cuadradas en cards, features y nav items
- Nuevas utilidades CSS: .font-ui-mono, .terminal-prompt, .status-dot,
.terminal-cursor, .ascii-art, .badge-download, .card-terminal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Add BrainGrid as a Featured Integration card
Adds BrainGrid to the FEATURED_ITEMS array so it appears on the homepage
Featured Integrations grid. The /featured/braingrid page was already in
place but had no corresponding card on the dashboard.
* Adapt Featured Integrations grid to item count
When there are an even number of featured items (e.g. 4), use a 2-column
grid on md+ screens so they form a 2x2 layout. When there are an odd
number (e.g. 3), keep the 3-column row layout.
---------
Co-authored-by: Claude <noreply@anthropic.com>
BrainGrid remains visible as a featured card on the homepage and via the
/featured/braingrid page; only the top-of-page banner is removed.
Co-authored-by: Claude <noreply@anthropic.com>
* migrate: Vercel → Cloudflare Pages + Workers para reducir costos ($110 → ~$0-5/mes)
- Cambia adaptador Astro de @astrojs/vercel a @astrojs/cloudflare (mode: 'directory')
- Agrega dashboard/wrangler.toml con nodejs_compat para compatibilidad total
- Crea cloudflare-workers/crons/ Worker que reemplaza los cron jobs de Vercel
(claude-code-check cada 30min, health-check cada 1h en vez de cada 15min)
- Actualiza CI/CD: Vercel CLI → wrangler pages deploy (requiere CLOUDFLARE_API_TOKEN y CLOUDFLARE_ACCOUNT_ID en GitHub Secrets)
- Elimina crons duplicados del proyecto legacy aitmpl (root vercel.json)
- Quick win: agrega Cache-Control headers a components.json (86400s), plugins.json,
trending-data.json y claude-jobs.json para cortar el costo de bandwidth de $53
Próximos pasos manuales (ver PR description):
1. Crear proyecto en Cloudflare Pages
2. Agregar secrets de Cloudflare en GitHub
3. Migrar env vars de Vercel a Cloudflare Dashboard
4. Deployar cloudflare-workers/crons con wrangler
5. Apuntar dominios a Cloudflare Pages
* fix: nodejs_compat_v2 + react-dom/server.node alias para Cloudflare Workers
- Cambia compatibility_flags de nodejs_compat a nodejs_compat_v2
- Agrega alias vite react-dom/server → react-dom/server.node para evitar
MessageChannel error en module init time en Cloudflare Workers runtime
- Agrega ssr.noExternal para bundlear react-dom y aplicar el alias
* fix: revert compatibility_flags a nodejs_compat (estándar)
nodejs_compat_v2 no es el flag primario. El fix real del MessageChannel
error fue el alias vite react-dom/server → react-dom/server.node,
no el cambio de flag.
* fix: inject Cloudflare Pages runtime env into process.env via middleware
Add Astro middleware that copies context.locals.runtime.env (Cloudflare
Pages secrets) into process.env before each request, so API routes can
use process.env.X as a unified pattern without changing the call sites.
Also add || process.env.X fallbacks to all API routes/libs that were
using import.meta.env exclusively (build-time only in Vite).
Verified on staging: track-download-supabase, health-check,
claude-code-check, collections, github/token all return correct responses.
Strip absolute home directory paths from tool_args_summary before
rendering in ToolTimeline. Affects historical data already stored in DB.
Also adds scripts/run-review-cycle.sh for manual cycle testing with
--test-hook and --check modes.
- Replace description with "The repeatable way to plan and ship quality software with AI."
- Change tagline from "AI Product Planner" to "Plan. Build. Verify. Repeat." in brand color (#c5e063)
- Increase description font size to 13px with font-light weight for better readability
Co-authored-by: Claude <claude@anthropic.com>
The sidebar counts depended on ComponentGrid or page-specific scripts
to emit a custom event. Pages without those (component detail, trending,
jobs) never received counts. Now the sidebar fetches /components.json
directly on load.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Convert SkillSlideView from Tailwind shorthands to CSS variable inline
syntax to match dark mode overhaul from PR #451
- Add gpt-tokenizer for token counting per slide and total
- Fixed slide height (32rem) with "Show full document" toggle
- Revert client:only back to client:load (styling was the real issue)
- Update deployer agent to reflect auto-deploy via GitHub Actions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The marked library produces different HTML on server vs client, causing
React error #418. Switching to client:only="react" skips SSR entirely.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add share_slug and is_public columns to user_collections (migration 002)
- New API endpoint /api/collections/share: POST toggles sharing (auth),
GET fetches public collection (no auth, only public-safe fields)
- New public page /c/[slug] with header, install command, component grid
grouped by type, and CTA to create own collections
- Share button in MyComponentsView: generates link, copies to clipboard,
shows shared state. Security reviewed: no leak of clerk_user_id, email,
or internal UUIDs
- Add Python script (generate_plugins_json.py) that scans GitHub repos for
.claude-plugin/marketplace.json and plugin.json, extracting real component
counts by scanning plugin directories via GitHub API
- Replace static plugins.json with 30 verified repos (15 marketplaces,
15 individual plugins) with real stars and component data
- Add interactive PluginsGrid React component with search, sort by
stars/alphabetical, marketplace badge, and empty state
- Redesign plugin detail page: correct install instructions (/plugin
marketplace add), marketplace plugin listings with descriptions,
component breakdowns, and overview stats