The marketing site for the Jupiter Jots Chrome extension, built from the TaskFlow design group "Landing page" (project 17). It deploys separately from the extension. Live URL: https://jj.livesoftwaredeveloper.com.
Stack: Next.js 16.4.2 (App Router, Turbopack, output: "standalone"), React 19.3.0, Tailwind CSS 4.3.3, MDX (@next/mdx 16.4.2), next-themes 0.4.6, lucide-react 1.58.0, Geist via the geist 1.7.2 package (self-hosted, no font CDN). pnpm 10.
pnpm install
pnpm dev # http://localhost:3000
pnpm build # production build; every page is prerendered
pnpm lint
pnpm og # re-render share images and icons (needs Chrome and Python with Pillow)| What | Where | Current value |
|---|---|---|
| Governing law in the terms | GOVERNING_LAW in src/lib/site.ts (shown with a dashed outline on /terms) |
[your country] |
Already set: the Chrome Web Store listing (STORE_URL, every "Add to Chrome" link reads it), support email support@livesoftwaredeveloper.com (SUPPORT_EMAIL) and site URL https://jj.livesoftwaredeveloper.com (SITE_URL, overridable with the SITE_URL env var at build time).
| Route | Source | Design route |
|---|---|---|
/ |
src/app/page.tsx |
/site |
/guide |
src/content/guide.mdx |
/site-guide |
/faq |
src/content/faq.mdx |
/site-faq |
/changelog |
src/content/changelog.mdx |
/site-changelog |
/about |
src/content/about.mdx |
/site-about |
/support |
src/app/support/page.tsx |
/site-support |
/privacy |
src/content/privacy.mdx |
/site-privacy |
/terms |
src/content/terms.mdx |
/site-terms |
| 404 | src/app/not-found.tsx |
(same style as the content pages) |
Also sitemap.xml, robots.txt, manifest.webmanifest, favicon.ico, icon.svg, apple-icon.png. The design's old paths (/site, /site-privacy...) redirect permanently to the new ones (next.config.ts).
src/components/site/*: the design's components as React. Server components exceptNavLinks,MobileMenu(native modal<dialog>),Toc(scroll-spy),Faq(accordion item),ThemeToggleandThemeProvider.SiteHeader,SiteFooter,Platforms+PlatformLogo(brand SVGs inlined from the design, inplatform-logos.ts),PageIntro,Section,Prose(alsoSummary,Defs/Def,Kbd,Placeholder),Toc,Release,Shot,BrandLogo.
src/content/*.mdx: long-form copy. Each file exports itstoc. MDX pages can use<Section>,<Prose>,<Summary>,<Defs>,<Def>,<Kbd>,<Faq>,<SupportEmail />and<GoverningLaw />without imports (src/mdx-components.tsx).public/shots/*.webp: real extension screenshots from the TaskFlow design surface at 2x.next/imageserves resized copies; the hero pair is preloaded. Retake them there when the extension UI changes and update sizes inShot.tsx.src/app/globals.css: light and dark tokens (the extension's shadcn values), prose styles.og/:build.pyrenderspublic/og/<page>.png(1200x630) fromtemplate.html, plus the icons, fromog/jj-logo.svg.
- Light and dark follow the device; the footer has a System / Light / Dark switch. The choice is kept in
localStorageonly. - No analytics, cookies or third-party requests: fonts, images and logos are all served from this site.
- Skip link, visible focus rings, keyboard-operable menu and accordion,
aria-currentin nav and TOC, smooth scrolling only without reduced motion, no horizontal scroll down to 360px.
Every page builds its metadata with pageMetadata() (src/lib/seo.ts): absolute title, description, keywords, canonical, Open Graph and Twitter with its own image. Home metadata is in src/app/home-seo.ts (also the layout default). The layout adds Organization, WebSite and SoftwareApplication JSON-LD. A new page needs a row in IMAGES in og/build.py and an entry in src/app/sitemap.ts.
SITE_URL=https://jj.livesoftwaredeveloper.com pnpm bundle # build + copy public/, static assets and deploy/ into .next/standalone
PORT=3010 pnpm serve # node .next/standalone/server.jsOn a VPS with pm2 (same scheme as the Keon site):
- Upload
.next/standalone/to/home/jupiter_jots_website/releases/<id>/. - Optionally write
/home/jupiter_jots_website/shared/.env(see.env.example). - Run
deploy/activate.sh <id>: it pointscurrentat the release, reloads the pm2 appjupiter_jots_website(port 3010, localhost only,deploy/ecosystem.config.cjs), waits for a 200 and rolls back if it doesn't get one. The last 5 releases are kept. - Proxy
jj.livesoftwaredeveloper.comto127.0.0.1:3010(Caddy or nginx).
Change the app directory or port in both deploy files if the server differs. The site also deploys to Vercel unchanged.