Folio es una aplicación de estudio, pensada para funcionar como sitio estático (sin backend propio) y persistir el progreso en el navegador.
El proyecto está construido con Next.js (App Router) y se exporta a HTML estático (output: 'export') para poder desplegarse en GitHub Pages.
- La app carga el índice desde
GET <basePath>/api/db.json. - Si
db.jsondeclara datasets, también carga cada dataset desdeGET <basePath>/api/<archivo>.json. - Todo se normaliza en el cliente (topics/flashcards/questions/stats).
Notas importantes:
- El
basePathse calcula conNEXT_PUBLIC_BASE_PATH. - Existe un fallback “bundled” para casos de fallo de red, que se alimenta desde la carpeta
public/api/(import estático ensrc/lib/data-api.ts). Los datos enpublic/api/son la única fuente de verdad tanto para build-time como para runtime.
Documentos del temario:
- Los recursos (Markdown/PDF/MP3) enlazados desde el temario se sirven como ficheros estáticos desde
public/data/(por ejemplo:/data/general/...).
- El estado del usuario (temas completados, SRS de flashcards, estadísticas) se guarda en
localStorage. - Al iniciar, se ejecuta una hidratación que mezcla:
- Campos “de esquema” desde la API (lo nuevo gana).
- Progreso del usuario desde
localStorage(se preserva).
- Las claves se aíslan por usuario (prefijo por ID), y el usuario activo se guarda como
folio_active_user_id.
- La app usa Authgear con OAuth de GitHub.
- El callback vive en
/auth/callback/(con barra final portrailingSlash: true). - Para desarrollo, se puede saltar el login con
NEXT_PUBLIC_SKIP_AUTH=true.
Más detalles en docs/AUTHENTICATION.md.
Requisitos:
- Node.js 20+
- npm
Pasos:
git clone https://github.com/espora-net/Folio.git
cd Folio
npm ci
cp .env.example .env.local
# Opcional: saltar autenticación en local
# Edita .env.local y pon:
# NEXT_PUBLIC_SKIP_AUTH=true
npm run devAbrir http://localhost:3000.
El repositorio está configurado para export estático. En Next.js con output: 'export', el comando genera out/.
npm run buildPara previsualizar out/ como sitio estático:
python3 -m http.server -d out 4173Abrir http://localhost:4173.
Este repo trae un workflow de Actions que construye y publica en Pages: .github/workflows/nextjs.yml.
- En GitHub: Settings → Pages
- Build and deployment: seleccionar GitHub Actions
En GitHub Pages, la URL suele ser https://<owner>.github.io/<repo>/.
El código usa NEXT_PUBLIC_BASE_PATH para que:
- Las rutas y assets se sirvan bajo
/<repo> - La API JSON se resuelva como
/<repo>/api/...
El workflow usa actions/configure-pages con static_site_generator: next, que ajusta la configuración para Pages.
Si quieres login real en Pages, en Authgear debes permitir el redirect:
https://<owner>.github.io/<repo>/auth/callback/
Si solo quieres un demo sin login, define NEXT_PUBLIC_SKIP_AUTH=true durante el build (por ejemplo como Repository Variable de Actions).
- Push a
maindispara el workflow. - El job construye
out/, copiapublic/apiaout/apiy despliega el artifact.
-
app/: rutas Next.js (landing,/dashboard,/auth/callback) -
src/lib/data-api.ts: carga/normaliza datasets desdepublic/api -
src/lib/storage.ts: persistencia + hidratación desde la API -
public/api/: datasets JSON servidos como “API estática” -
docs/DATA_SCHEMAS.md: documentación de schemas JSON y validación
Para validar que los archivos JSON cumplen con los schemas definidos:
npm run validate-schemasEste comando valida db.json y todos los archivos db-*.json contra sus respectivos schemas. Ver docs/DATA_SCHEMAS.md para más detalles sobre la estructura de datos y el significado de cada campo.
public/api/es la única fuente de verdad de datos (runtime y fallback bundled).NEXT_PUBLIC_BASE_PATHcontrola rutas y assets cuando se despliega bajo subdirectorio (p. ej. GitHub Pages).- La app evita persistir preguntas:
questionsvienen del dataset yflashcardsse derivan a partir de ellas. - Los datasets pueden declararse con una
urlabsoluta externa endb.json; en runtime se prioriza y se añade cache-busting. Requiere que el origen permita CORS.