Commit Graph

80 Commits

Author SHA1 Message Date
Daniel Avila a0cd1f3afb Add plugin details modal and search to marketplace pages (#697)
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.
2026-07-11 21:04:13 -04:00
Daniel Avila c7c4dcd1a1 fix: add missing Turkey flag, fix mobile CTA overflow, fix OSS icons in dark mode (#676)
- 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.
2026-07-05 13:15:07 -04:00
Daniel Avila e88d8a82a5 fix: improve mobile flexbox layout in dashboard toolbar and header (#675)
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.
2026-07-05 12:58:47 -04:00
daniel f3cdeb2907 fix: temporarily replace sidebar logo with a simple icon
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>
2026-07-04 20:42:12 -04:00
daniel 9716917acb fix: implement working mobile menu and fix horizontal overflow
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>
2026-07-04 20:29:03 -04:00
daniel bb89a27600 feat: add "Promote your component" CTA to Featured Integrations
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>
2026-07-04 19:53:50 -04:00
daniel 8a09d13800 feat: add Sentry error tracking to workers, dashboard, and CLI
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>
2026-07-04 16:38:20 -04:00
Daniel Avila 51e3e9cdf4 perf: split components.json to cut dashboard browser payload (#672)
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>
2026-07-04 16:22:46 -04:00
Daniel Avila 8f88af7b80 Remove TinyFish from featured integrations (#644)
Remove the TinyFish entry from FEATURED_ITEMS and its slug content
blocks in the featured page.


Claude-Session: https://claude.ai/code/session_019iPQRLExN1ANkmKrmnWdA5

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-21 21:42:47 -04:00
Daniel Avila 7f890b1b3b feat: add Loops component type with referenced components (#643)
* 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>
2026-06-21 20:19:16 -04:00
daniel 41f4a13bec perf(images): convertir logos a WebP + preload LCP para mejorar Performance score
- 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>
2026-06-13 17:33:07 -04:00
daniel 41cbbea00c perf(dashboard): reducir payload del home 87% y restaurar caching en Cloudflare
- 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>
2026-06-13 16:58:13 -04:00
daniel e2314c6a50 feat(dashboard): jobs sidebar vertical + hero ajustes
- 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>
2026-06-13 14:22:37 -04:00
daniel 13d8a1ee87 feat(dashboard): re-tematizar UI a estética CLI/terminal híbrida
- 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>
2026-06-13 13:59:03 -04:00
Daniel Avila 3da1223b40 Add BrainGrid to Featured Integrations cards (#594)
* 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>
2026-05-16 21:38:35 -04:00
Daniel Avila 7f5948dfc9 Remove BrainGrid partner banner from dashboard pages (#593)
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>
2026-05-16 21:21:36 -04:00
Daniel Avila b563bc423a seo: add dynamic sitemap.xml and per-component JSON-LD (#589) 2026-05-14 21:29:39 -04:00
Daniel Avila dae5faa009 migrate: Vercel → Cloudflare Pages + Workers (/mes → ~/bin/zsh-5/mes) (#571)
* 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.
2026-05-08 20:24:28 -04:00
Daniel Avila 35023b3def Update BrainGrid partner banner tagline (#554) 2026-04-29 19:57:31 -04:00
Dani acf54a1597 feat(dashboard): add View on GitHub button to component detail page
- Adds GitHub link button in the same row as metadata labels
- Regenerates components.json and trending-data.json
2026-04-26 15:27:21 -04:00
Dani 6cb4c8eb67 fix(live-task): sanitize local paths in tool executions display
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.
2026-04-25 22:53:56 -04:00
Daniel Avila 19d7c7d594 feat(live-task): add Open/All/Done filter pills to Component Review Loop (#540)
- Default view shows only Open cycles (active + completed/pr_created)
- Done tab shows merged + failed cycles
- All tab shows everything
- Badge count per filter updates dynamically
- Adding "showing N of M" subtitle under header
2026-04-25 15:17:52 -04:00
Daniel Avila cc1ceb3d85 feat(banner): update BrainGrid ad copy and styling (#537)
- 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>
2026-04-24 16:21:39 -04:00
daniel a2e1afaa00 fix(sidebar): load component counts independently from page components
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>
2026-04-11 22:00:01 -04:00
daniel d37c578f50 fix(slides): use CSS variables for styling, add token counts, fixed height with expand
- 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>
2026-04-11 21:54:09 -04:00
daniel 87af8845c6 fix: Use client:only for SkillExplorer to prevent hydration mismatch
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>
2026-04-11 19:50:23 -04:00
Daniel Avila e4d262e7d8 Merge pull request #471 from davila7/claude/skills-slide-presentation-5JOPn
Add slide presentation view for skill documentation
2026-04-11 19:24:42 -04:00
daniel e6313a42df chore: Remove .claude-plugin dir, update jobs, remove plugins "New" badge
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 17:02:56 -04:00
Dani be8629942a feat(dashboard): re-enable TinyFish in featured items 2026-04-08 09:09:40 -04:00
Dani f8a855f611 feat(dashboard): add open source sponsors footer 2026-04-07 16:30:32 -04:00
Dani 93ded5fc6d fix: Update TinyFish featured page with accurate metrics
Replace 98.7% success rate with 90% Mind2Web benchmark score and
$0.04/operation with $0.015/step all-inclusive pricing.
2026-04-01 17:56:44 -04:00
Dani f1029dd446 chore: Hide TinyFish from featured section temporarily 2026-03-31 21:15:43 -04:00
Dani 36fa6dbd5d feat: Add supply-chain-guard skill, worktree commands, security hooks, and updated catalog
New components:
- supply-chain-guard skill (security): npm/PyPI/CI supply chain scanner with IOC database
- worktree-guide skill: parallel development with git worktrees
- dependabot-review skill: automated Dependabot PR management
- worktree-check/cleanup/deliver/init commands (git-workflow)
- edit-audit-log hook (development-tools)
- env-file-protection and force-push-blocker hooks (security)

Also includes:
- Regenerated components.json catalog (docs + dashboard)
- TinyFish featured page updates and logo
- .vercelignore and dashboard .gitignore updates
2026-03-31 21:13:20 -04:00
Dani eba3d9da28 fix: Elevate parent card z-index when collection dropdown is open 2026-03-30 21:27:20 -04:00
Dani 1a8cd2e2c7 fix: Calculate dropdown position on click instead of useEffect 2026-03-30 21:23:20 -04:00
Dani e7c76e7a3a fix: Move hooks before conditional returns to fix React #310 error 2026-03-30 21:19:21 -04:00
Dani 1c2ac0900c fix: Use fixed positioning for collection dropdown to prevent card clipping 2026-03-30 21:15:34 -04:00
Dani f53cf7051a fix: Raise z-index on collection dropdown so it appears above other cards 2026-03-29 21:38:17 -04:00
Dani f469555013 fix: Show real email in user menu, remove My Collections option 2026-03-29 21:34:34 -04:00
Dani 5317c55368 feat: Share modal with copy link and social sharing, collection title label
- Share button now opens modal with copyable link and share on X/Threads
- Public collection page shows "Component Collection" label above name
2026-03-29 20:36:31 -04:00
Daniel Avila 4e851a7e2c Merge pull request #482 from davila7/feat/shareable-collections
feat: Shareable public collections via /c/{slug}
2026-03-29 20:11:02 -04:00
Dani b224f1eb62 fix: Share button copies link instead of toggling off sharing
When collection is already shared, clicking Share now copies the link
again instead of disabling sharing. Identified by cubic.
2026-03-29 20:09:02 -04:00
Dani ebc988aa31 fix: Fix esbuild parse error in shared collection page 2026-03-29 12:30:41 -04:00
Dani 2d9dec6f4b feat: Add shareable public collections via /c/{slug}
- 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
2026-03-29 12:06:33 -04:00
Daniel Avila 13fbc320a5 Merge pull request #455 from bitreonx/fix/profile-dropdown-z-index
Fix profile dropdown z-index
2026-03-28 18:07:34 -04:00
Dani a7c5fbabed fix: Correctly read components.json structure for sidebar counts 2026-03-28 10:12:35 -04:00
Dani 4d96a18776 fix: Emit sidebar component counts on plugins pages 2026-03-28 10:04:43 -04:00
Dani 06b3833a1b fix: Remove marketplace badge from plugin cards 2026-03-28 10:02:05 -04:00
Dani 5bfcbcc57a feat: Overhaul plugins page with real .claude-plugin data, search, and sorting
- 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
2026-03-28 09:48:12 -04:00
Dani 2540d684e2 feat: Add /plugins page with 20 curated Claude Code marketplaces
- Create plugins.json with 20 popular GitHub plugin collections sorted by stars
- Add /plugins listing page with grid cards (stars badge, tags, author)
- Add /plugins/[slug] detail page with "What's Inside" breakdown and highlights
- Add "Plugins" link with "New" badge to sidebar Browse section
2026-03-27 09:24:12 -04:00