L'annuario storico del PN: volti, nomi e momenti che rendono unico il nostro polo. Sfoglia le edizioni passate e aggiungi la tua foto alla Hall of Fame.
Translation pending
SocialTypeScript · JavaScriptGitHub @GiacomoM02OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Se ci stai cliccando sai di cosa si tratta. Altrimenti seguici su Ig
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Applicazione web per l'Annuario storico del PN — Università di Pisa. Next.js 14 (App Router + Server Actions), Tailwind CSS, Vercel Postgres (Drizzle ORM), Vercel Blob, Upstash Redis (OTP volatile), Resend (email). • Zero-retention delle email: l'indirizzo istituzionale viene scritto solo su Upstash Redis con TTL di 5 minuti (lib/otp.ts), mai nel database Postgres. Dopo la verifica, il client riceve un token firmato (HMAC, lib/token.ts) che non contiene l'email, valido 15 minuti: è la prova che serve al form per sbloccare l'upload [README 설치·사용 부분 발췌] Setup localeRead the full README ↗
Applicazione web per l'Annuario storico del PN — Università di Pisa. Next.js 14 (App Router + Server Actions), Tailwind CSS, Vercel Postgres (Drizzle ORM), Vercel Blob, Upstash Redis (OTP volatile), Resend (email).
annuario-del-pn/
├── drizzle/
│ └── schema.ts # Schema DB: hall_of_fame_entries, archived_editions
├── drizzle.config.ts
├── src/
│ ├── app/
│ │ ├── layout.tsx # Layout root, font, Navbar/Footer
│ │ ├── globals.css
│ │ ├── page.tsx # Home
│ │ ├── archivio/
│ │ │ └── page.tsx # Archivio (griglia edizioni + download PDF)
│ │ └── hall-of-fame/
│ │ ├── page.tsx # Hall of Fame (server component, fetch iniziale)
│ │ └── actions.ts # Server Actions: OTP, verifica, upload, polling
│ ├── components/
│ │ ├── Navbar.tsx
│ │ ├── Footer.tsx
│ │ ├── HallOfFameBoard.tsx # Client: griglia + polling + stato ottimistico
│ │ ├── PhotoCard.tsx
│ │ ├── UploadModal.tsx
│ │ └── UploadForm.tsx # Client: step Email -> OTP -> Dettagli foto
│ └── lib/
│ ├── db.ts # Connessione Drizzle + Vercel Postgres
│ ├── blob-upload.ts # Validazione e upload immagini su Vercel Blob
│ ├── otp.ts # Generazione/verifica OTP su Upstash Redis (TTL)
│ ├── token.ts # Token firmato HMAC "email verificata" (no email dentro)
│ ├── email.ts # Invio OTP via Resend
│ ├── validations.ts # Schemi Zod
│ └── utils.ts
├── tailwind.config.ts
├── next.config.mjs
└── .env.local.example
lib/otp.ts), mai nel
database Postgres. Dopo la verifica, il client riceve un token firmato
(HMAC, lib/token.ts) che non contiene l'email, valido 15 minuti:
è la prova che serve al form per sbloccare l'upload, senza lasciare
traccia persistente dell'identità del mittente.revalidatePath("/hall-of-fame") (rigenera l'SSR per i nuovi visitatori)
e aggiorna otticamente lo stato React lato client di chi ha appena
caricato la foto. Un polling leggero ogni 15s (getLatestEntriesAction)
aggiorna la griglia anche per chi ha già la pagina aperta, senza bisogno
di WebSocket/infrastruttura aggiuntiva (compatibile col piano Vercel free).npm install.env.local.example in .env.local e compila le variabili:
POSTGRES_URL e derivate.BLOB_READ_WRITE_TOKEN.UPSTASH_REDIS_REST_URL / ..._TOKEN.RESEND_API_KEY.OTP_SIGNING_SECRET con openssl rand -base64 32.npm run db:pushnpm run devNon è richiesta un'interfaccia di amministrazione nel primo step: le righe
di archived_editions (PDF + copertina, già caricati su Vercel Blob) si
possono inserire manualmente con npm run db:studio (Drizzle Studio) o via
uno script di seed, finché non verrà costruita una pagina /admin dedicata.
UPSTASH_REDIS_REST_URL/TOKEN, RESEND_API_KEY,
RESEND_FROM_EMAIL, OTP_SIGNING_SECRET, NEXT_PUBLIC_APP_URL./admin protetta per caricare nuove edizioni (PDF + copertina).