A minimal Nuxt static-site project for the JabRef landing page. It uses Vue components and Nuxt static generation, but includes no server routes, database, authentication, GraphQL, or runtime API calls.
The Vue implementation is based on the JabRefOnline project, created by Tobias Diez.
pages/index.vuecontains the landing-page content: hero copy, download and support links, community cards, and the list of feature sections.components/FeatureSection.vueis the reusable Vue component used for each feature row.public/assets/contains the main product images and logo. Files inpublic/are served unchanged below the configured site base path.public/img/contains browser icons and the favicon asset.assets/main.csscontains the small site-wide style sheet, including the automatic dark-theme colors.assets/legal-notices.htmlandassets/privacy-policy.htmlcontain the bundled legal text as simple semantic HTML.
Edit pages/index.vue. The file is organized in the same order as the page: hero, features, download, community, and support. Update an anchor's href to change a destination.
- Put the feature image in
public/assets/. - Add a
FeatureSectioninside the#featuressection inpages/index.vue. - Pass its title, image path, and meaningful alternative text. Add
reverseto place its image on the left on larger screens.
Example:
<FeatureSection
title="Search"
image="/assets/feature-search.png"
image-alt="JabRef search results"
reverse
>
<ul>
<li>Describe the feature.</li>
</ul>
</FeatureSection>Copy an image to public/assets/ and reference it with /assets/filename.ext. The provided assetUrl() helper prefixes it with the configured base path; no import or build configuration is needed.
Nuxt creates routes from files in pages/:
- Create a Vue single-file component. For example,
pages/about.vuebecomes/about. - Add the page content to its
<template>. - Reuse components from
components/directly; Nuxt auto-imports them. - Add a
<NuxtLink to="/about">About</NuxtLink>where the page should be discoverable, such as the navigation or footer. - Run
pnpm generate. The generated page will be at.output/public/about/index.html.
Example:
<!-- pages/about.vue -->
<template>
<main class="container legal-page">
<h1>About JabRef</h1>
<p>JabRef is a free and open-source reference manager.</p>
</main>
</template>For a nested route such as /help/install, create pages/help/install.vue.
Homepage sections are in pages/index.vue, in the order they appear on the site.
- Add a new
<section>with a uniqueid, such asid="news". - Use the
containerclass to align it with the rest of the page. - Add a navigation link with
href="#news"if visitors should jump to it from the header. - Add section-specific CSS to
assets/main.cssunder a clearly labelled comment.
Example:
<section id="news" class="container support">
<div class="centered">
<h2>Latest news</h2>
<p>Read updates from the JabRef project.</p>
</div>
</section>To add a product feature row, use the existing FeatureSection component instead:
<FeatureSection
title="Search"
image="/assets/feature-search.png"
image-alt="JabRef search results"
reverse
>
<ul>
<li>Describe the feature.</li>
</ul>
</FeatureSection>pnpm install
pnpm dev
pnpm generate
pnpm previewDeploy the generated .output/public directory to any static host.
Do not open .output/public/index.html with a file:// URL. Nuxt's generated
JavaScript and CSS use web-server paths. Run pnpm preview locally, then open
the localhost URL it prints; static hosts provide the same path handling.
The site base path is configurable with NUXT_APP_BASE_URL at build time:
# Preview the GitHub Pages project URL locally
NUXT_APP_BASE_URL=/jabref-website/ pnpm generateLocal builds default to /. The GitHub Actions workflow defaults to
/jabref-website/, which is required for the temporary GitHub Pages URL. When
the custom domain is ready, create the repository Actions variable
NUXT_APP_BASE_URL with the value /; the next deployment will use the domain
root without a source-code change.
GitHub Actions runs on pull requests and pushes to main. The workflow in
.github/workflows/build.yml runs pnpm generate and uploads .output/public
as the GitHub Pages artifact, then deploys pushes to main to GitHub Pages.