尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Sigue actores, actrices o directores y lleva registro de qué películas de su filmografía ya viste. MVP enfocado en una sola tarea: completar la filmografía de la gente que te interesa.檢視完整 README ↗
Sigue actores, actrices o directores y lleva registro de qué películas de su filmografía ya viste. MVP enfocado en una sola tarea: completar la filmografía de la gente que te interesa.
server) — routing, layouts, SSROMDB_API_KEY; sin ella simplemente no se muestran)PUBLIC_SENTRY_DSN, ver .env.example)/search)/search/wrapped con tu resumen del año, "on this day" en el perfil de cada persona — todo togglable en src/config/engagement.jsonlocalStorage)localStorage para los proxies de persona/película (src/lib/movieData.ts) — evita re-pedir por red en cada carga de página lo que ya se pidió antes (ver design.md)aria-live en cambios de estado, auditoría axe-core automáticapnpm install
pnpm dev
Copia .env.example a .env y completa:
TMDB_API_KEY — TMDB v4 read access token (server-only)PUBLIC_FIREBASE_* — config del proyecto Firebase (cliente, público por diseño)OMDB_API_KEY — opcional, server-only (ratings externos en el detalle de película; sin ella esa sección simplemente no aparece)| Comando | Acción |
|---|---|
pnpm dev | Servidor local en localhost:4321 |
pnpm build | Build de producción a ./dist/ |
pnpm astro check | Typecheck |
pnpm lint | ESLint |
pnpm format:check | Prettier |
pnpm test | Vitest (lógica pura) |
pnpm test:rules | Tests de firestore.rules contra el Firebase Emulator (necesita Java) |
pnpm test:e2e | Playwright: flujo core buscar → seguir → marcar vista (necesita Java) |
CI (GitHub Actions) corre las primeras cinco cosas de arriba en el job ci, y pnpm test:rules/pnpm test:e2e cada uno en su propio job (firestore-rules, e2e), en cada push/PR a main. Pre-commit (Husky + lint-staged) hace eslint --fix + prettier --write sobre lo staged. Hay además dos workflows semanales/manuales: Lighthouse (performance) y axe-core (accesibilidad), ambos informativos contra producción.
src/
├── components/
│ ├── auth/ # LoginButton, UserMenu (incluye export de datos)
│ ├── theme/ # ThemeToggle (dark mode)
│ ├── search/ # HeaderSearch (dropdown), SearchTabs (página /search)
│ ├── movies/ # MovieSearch, MovieResultRow, MovieWatchlistButton
│ ├── connections/ # ConnectionsPage
│ ├── onboarding/ # OnboardingCarousel (una sola vez, localStorage)
│ ├── wrapped/ # WrappedStats (página /wrapped)
│ ├── people/ # PersonSearch, PersonHeader, PersonInfo, PersonPhotoGallery, FollowButton
│ ├── filmography/ # Filmography, MovieItem, MovieDetailsDialog, WatchlistPage,
│ │ # Dashboard, FollowedPeopleHero (GSAP)
│ └── ui/ # shadcn/ui
├── lib/
│ ├── firebase/ # client, auth, firestore (incluye exportUserData, badges)
│ ├── tmdb/ # client, people, movies, image, genres (server-only salvo image.ts/genres.ts)
│ ├── omdb.ts # ratings externos (IMDb/RT/Metacritic), nunca rompe si falla
│ ├── movieData.ts # fetchPersonData/fetchMovieDetails — wrapper cacheado de /api/person
│ │ # y /api/movie, reusar en vez de fetch() a mano (ver design.md)
│ ├── clientCache.ts # cache genérico con TTL sobre localStorage, usa movieData.ts
│ ├── a11y.ts # announce() — región aria-live compartida
│ ├── api.ts # helpers de respuesta JSON + rate limiting para /api/*
│ ├── rateLimit.ts # limitador en memoria por IP
│ ├── download.ts # descarga de JSON en el navegador
│ └── recentSearches.ts # localStorage helper (client-only)
├── config/
│ └── engagement.json # toggles de badges/nudges/wrapped/on-this-day
├── middleware.ts # headers de seguridad (CSP, etc.) en toda respuesta
├── pages/
│ ├── api/ # proxy endpoints a TMDB (search-person, search-movie, person/[id],
│ │ # person/[id]/images, movie/[id]) — cacheados y rate-limited
│ ├── person/[id].astro
│ ├── search.astro
│ ├── filmographies.astro
│ ├── watchlist.astro
│ ├── connections.astro
│ └── wrapped.astro
└── types/
public/
├── manifest.webmanifest # PWA
├── sw.js # service worker (hand-written, sin Workbox)
└── pwa-*.png, favicon.ico # íconos generados desde pwa-source-icon.svg
Modelo de datos en Firestore, reglas de seguridad, y el porqué de cada decisión no obvia (CSP, PWA, rate limiting, gotchas de deploy): ver firestore.rules y design.md. Ideas pendientes para llevar el proyecto a otro nivel técnico: TODO.md.