* feat(web): Linux-flavoured 404 page that sends visitors back The static export served Next's default "404: This page could not be found." with no way back into the site. - "This page is not in your $PATH" heading, plus three true facts about 404 (chmod 404, exit 404 -> $? = 148, 0x194 / 0o624 / 0b110010100). - "Did you mean ...?" suggests the closest page the site links to, by edit distance after lowercasing. Catches typos and case slips, which matter because GitHub Pages paths are case-sensitive. - Back to home and Install buttons, plus quick links to the install guides, FAQ, engine comparison, troubleshooting and changelog. - Title "Page not found | Vocalinux", noindex. * fix(web): keep the 404 page working on malformed URLs decodeURIComponent throws on escapes like /%FF/, which replaced the 404 page with an error screen. Fall back to the raw path, and add mounted tests for the suggestion and the malformed case.
Vocalinux website
Marketing site for vocalinux.com, built with Next.js and deployed as a static export (GitHub Pages).
Product claims and design constraints: PRODUCT.md, DESIGN.md. Agent notes: AGENTS.md.
Development
npm install
npm run dev
Production build
npm install
npm run build
Static output is written to out/.
Local preview of the build
cd out
python3 -m http.server 3000
Open http://localhost:3000.
Scripts
| Script | Purpose |
|---|---|
npm run dev |
Dev server |
npm run build |
Production static export |
npm run deploy |
Build and prepare GitHub Pages (.nojekyll, CNAME) |
npm run lint |
ESLint |
npm run typecheck |
TypeScript |
Deployment
Push to main triggers the site workflow. Production host: vocalinux.com.
Manual path:
cd web
npm install
npm run deploy
That produces out/ with .nojekyll and a CNAME for vocalinux.com.
Layout
web/
├── src/
│ ├── app/ # Next.js app routes
│ ├── components/
│ │ ├── site-chrome.tsx
│ │ └── ui/ # Reusable UI components
│ ├── hooks/
│ └── lib/
├── public/ # Static assets and screenshots
├── out/ # Build output (generated)
└── package.json
Configuration notes
- Custom domain:
deployscript writesout/CNAME - Subdirectory deploy: set
basePathinnext.config.jsif needed - Family workbench UI: warm paper, system type, same language as VocaHQ (DESIGN.md)
Troubleshooting
| Symptom | Check |
|---|---|
| Module not found | npm install |
| Type errors | npm run typecheck |
| Lint errors | npm run lint |
| 404 on GitHub Pages | Ensure out/.nojekyll exists |
| Assets 404 | Confirm basePath matches deploy path |
License
Same as the main Vocalinux project (AGPL-3.0).