
A visual portfolio platform for developers, designers and digital creators.
A visual portfolio platform for developers, designers and digital creators.
vis brings your CV, projects and digital identity together in one visual profile.
npm install
cp .env.example .env.local
npm run db:migrate
npm run db:seed
npm run dev
Enten Postgres installert på maskinen (brew install postgresql@16, så createdb vis),
med DATABASE_URL=postgres://localhost:5432/vis, eller en egen Neon-database/-branch.
| Variabel | Hva | Påkrevd lokalt |
|---|---|---|
DATABASE_URL | Postgres-tilkobling | Ja |
BETTER_AUTH_SECRET | Tilfeldig hemmelighet, openssl rand -base64 32 | Ja |
BETTER_AUTH_URL | http://localhost:3000 lokalt, domenet i produksjon | Ja |
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET | GitHub OAuth-app, for innlogging og repo-import | Nei, knappen skjules uten |
BLOB_READ_WRITE_TOKEN | Vercel Blob. Uten den lagres bilder i public/uploads | Nei |
ANTHROPIC_API_KEY | Språkmodellen som leser CV-er | Nei, bare for CV-import |
GitHub OAuth-app: github.com/settings/developers → New OAuth App.
Callback-URL: http://localhost:3000/api/auth/callback/github (lag en egen app for produksjon).
db/schema.tsnpm run db:generate lager en ny migrering i db/migrations/npm run db:migrate kjører dennpm run db:studio åpner et vindu der du kan se og endre dataene.
db/schema.ts alle tabellene
lib/auth.ts innlogging (Better Auth), brukernavn-regler
lib/username.ts hva som er et gyldig brukernavn, og forslag når det er tatt
lib/auth-errors.ts norske feilmeldinger for innlogging/registrering
lib/session.ts getCurrentUser() / requireUser() for sider og actions
lib/projects.ts prosjekter: lese, opprette, endre, slette, bilder, feed, søk, tagger
lib/github.ts GitHub-import (repoliste, README → prosjekt)
lib/folder-import.ts import fra lokal mappe (kjører i nettleseren, koden lastes ikke opp)
lib/cv.ts, cv-parser.ts strukturert CV: lagring, redigering og tolking av PDF/Word/bilde
lib/cv-document.ts CV-dokumentet som vises på profilen (PDF-sider som bilder)
lib/pdf-pages.ts gjør PDF-sider om til bilder i nettleseren (pdf.js)
lib/comments.ts kommentarer (og varsel til prosjekteieren)
lib/notifications.ts varsler
lib/profiles.ts profilsider
lib/storage.ts filopplasting (Vercel Blob / lokalt)
app/actions/*.ts Server Actions som skjemaene kaller
components/ ProjectCard, ProjectCover, CvPages, kommentarer osv.
Alle Server Actions returnerer { ok: true, data } eller { ok: false, error, fieldErrors? },
så skjemaer kan vise feilmeldinger uten try/catch. Alt som endrer data sjekker at brukeren
er logget inn og eier det som endres.
Appen har tre temaer: midnight (standard), dark og light. ThemeProvider setter
data-theme på <html>, og alle farger er CSS-variabler i app/globals.css. Derfor bytter
både klientkomponenter og server-sider farge sammen. Bruk disse klassene i ny kode:
| Klasse | Brukes til |
|---|---|
bg-ink | sidebakgrunn |
bg-surface | kort, felter og menyer |
border-line | streker og rammer |
text-fg | vanlig tekst |
text-mist | dempet tekst |
text-ice | aksent på tekst og lenker |
bg-primary text-on-primary | knapper |
components/Sidebar.tsx (desktop) og components/MobileNav.tsx (mobil) ligger i
app/layout.tsx, så alle sider får navigasjon automatisk. Menyvalgene endrer seg etter om
man er logget inn. Sider legger inn md:pl-28 for å gi plass til sidemenyen.
Rutene heter /sok, /logg-inn, /ny og /varsler. /explore og /login sender videre
til de to første, så gamle lenker fortsatt virker.
DATABASE_URL settes automatisk.BLOB_READ_WRITE_TOKEN settes automatisk.BETTER_AUTH_SECRET, BETTER_AUTH_URL (f.eks. https://vis.no), GitHub-nøklene og ANTHROPIC_API_KEY under Settings → Environment Variables.DATABASE_URL=<prod-url> npm run db:migrate.Neon (console.neon.tech): lag et prosjekt i regionen AWS Europe Central 1 (Frankfurt).
Under Connect finnes to strenger: den med Connection pooling på (verten inneholder
-pooler) er DATABASE_URL, den uten er DATABASE_URL_UNPOOLED.
Render (dashboard.render.com): New → Web Service, koble til repoet, region Frankfurt.
| Felt | Verdi |
|---|---|
| Language | Node |
| Build Command | npm ci && npm run db:migrate && npm run build |
| Start Command | npm run start |
Miljøvariabler: DATABASE_URL, DATABASE_URL_UNPOOLED, BETTER_AUTH_SECRET,
BETTER_AUTH_URL (Render-adressen, f.eks. https://vis.onrender.com), NODE_VERSION=22,
BLOB_READ_WRITE_TOKEN, og valgfritt GitHub-nøklene og ANTHROPIC_API_KEY.
Ikke sett NODE_ENV: da hopper npm ci over devDependencies som bygget trenger.
Migreringene kjøres automatisk i hvert bygg. Bilder lagres i Vercel Blob også når appen
kjører på Render (Render sin disk tømmes ved hver omstart). Lag en Blob-store på vercel.com
under Storage og kopier BLOB_READ_WRITE_TOKEN.
Logg inn for å kommentere og svare.
Logg innhei