Linkfolio is a Nuxt app for building collections of links and sharing them via a public slug — optionally password-protected — with automatic link-preview scraping.
- Nuxt 4 / Vue 3, TypeScript
- Vuetify (via
vuetify-nuxt-module) — UI - Neon Serverless Postgres + Drizzle ORM — database
- Better Auth (
better-auth/vue), proxied to Neon Auth — authentication @nuxtjs/i18n— English/Russian@sentry/nuxt— error monitoring- Vitest +
@nuxt/test-utils— testing - Storybook + Chromatic — component development, visual testing
- ESLint + Prettier + Husky/lint-staged — linting, formatting, pre-commit hooks
- Node version pinned in
.nvmrc— runnvm use - pnpm (see
pnpm-lock.yaml) - A Neon account/project (for Postgres + Neon Auth)
-
Install dependencies:
pnpm install
-
Set up environment variables. Either copy
.env.exampleto.envand fill in the values from the Neon console, or, if the project is already linked (see.neon), pull them automatically:npx neon env pull
Variable Purpose DATABASE_URLPooled Postgres connection, used by the app at runtime DATABASE_URL_UNPOOLEDDirect Postgres connection, used for Drizzle migrations NEON_BRANCHLinked Neon branch name NEON_AUTH_BASE_URLNeon Auth backend URL, proxied by server/api/auth/[...all].tsNEON_AUTH_JWKS_URLNeon Auth JWKS endpoint BETTER_AUTH_API_KEYNeon Auth API key These values are project secrets — never expose them to client-side code.
-
Run database migrations:
pnpm db:migrate
(
pnpm db:generateregenerates migration files after changingserver/db/schema.ts.) -
(Optional) Sentry source map uploads.
pnpm builduploads source maps via@sentry/nuxt's build plugin, which needs an auth token separate from.env. Copy.env.sentry-build-plugin.exampleto.env.sentry-build-pluginand setSENTRY_AUTH_TOKEN(from Sentry → org "home-nbh" → project "linkfolio"). Not required forpnpm dev.
Start the development server on http://localhost:3000:
pnpm devpnpm testpnpm lint # or lint:fix
pnpm format # or format:fix
pnpm type-checkpnpm storybook # dev server at http://localhost:6006
pnpm build-storybookVisual tests run via Chromatic on every push/PR (see .github/workflows/chromatic.yml). Published Storybook: https://main--6a6f82979edc629ca6aeb6b4.chromatic.com/
Build the application for production:
pnpm buildLocally preview the production build:
pnpm previewOr generate a static build:
pnpm generateCheck out the deployment documentation for more information.
The app follows Feature-Sliced Design under app/, with a full CRUD API for collections, links, and sharing under server/api/. See CLAUDE.md for detailed architecture and conventions.