Website and documentation
The public site contains the Vue landing page and a VitePress documentation site at https://docs.hara.sh/. Both are static assets served by the same Worker. Building the site does not start Docker, read 1Password, or copy runtime state into the public output.
Install and run
Use Node.js 22.12+ and npm; a current LTS release is recommended:
bash
make web install
make web devmake web dev starts the landing-page dev server; its Docs link opens the public documentation site. Use this command for a local documentation server with live Markdown editing:
bash
make web docsVitePress serves the docs at http://localhost:5174/. The website and docs can be developed without any proxy credentials or a provider account.
Design and content
| Path | Purpose |
|---|---|
web/src/styles/design-tokens.css | Shared gray and purple palette, typography, spacing, radii, and page width |
web/src/styles/tokens.css | Tailwind mappings for the shared tokens |
web/src/lib/content.ts | Landing-page copy and documentation link |
web/docs/*.md | Public guides |
web/docs/.vitepress/config.ts | Sidebar, local search, metadata, and build configuration |
web/docs/.vitepress/theme/ | Sasu's documentation layout adapted to Hara's shared tokens |
The docs retain Sasu's navigation, sidebar/content separator, inset search, and page outline. They use the landing page's black backgrounds, purple accents, Geist text, and Geist Mono code. Search runs locally over the built public documentation.
Build and verify
bash
make web build
make code check
make format-allmake web build type-checks the project, builds VitePress into the ignored web/public/docs/ directory, and builds the combined Vite site. VitePress checks internal links during the build. make code check runs shell lint, Go vet/tests, the combined web build, and the existing 100% application coverage gate. It needs Go, shellcheck, Node.js, and installed web dependencies. If fmtkit is installed, lint also checks the application TypeScript.
make format-all is the compatibility entrypoint for the repository's fmtkit formatting command. Keep browser test screenshots, traces, and recordings outside the checkout.
Preview the production build
bash
cd web
npm run previewPreview the landing page locally. Use make web docs for the documentation preview. In production, check https://docs.hara.sh/, a direct link such as /setup, local search, a missing page, and mobile navigation. The Worker maps the docs hostname to the built documentation assets and redirects old hara.sh/docs/... links. Generated docs and the local-search index contain public Markdown only.
Publish your website
Publishing the website is separate from exposing the private proxy. You need a Cloudflare account and a local cf authentication/profile configuration. The account is selected outside version control; no account ID or credential is embedded in the public config.
Before publishing your own fork, replace the domains in web/cloudflare.config.ts, the canonical host in web/worker/host.ts, and the public origins in web/index.html, web/docs/.vitepress/config.ts, web/public/robots.txt, and web/public/sitemap.xml. Use domains you control and review the cf deployment plan for your account.
bash
make web deployThe command builds the combined site, runs coverage, and invokes the installed cf CLI. It publishes only website assets and the static-asset Worker; it does not deploy the Docker proxy. Run it only when you intend to publish to the configured account and domains.