Website development and deployment
udiot.in is built with @tagna/udiot@1.0.0-rc.1. Its source uses defineWebApp,
definePage, createWebBuilder and createWebServer. Browser examples use the
installed Store and Form APIs; the DI example runs a fixed Container operation
on the Node server.
Run locally
From the website repository, or apps/udiot.in in a framework checkout:
npm ci
npm run build
npm test
npm start
Open http://localhost:3000. npm run dev builds once and starts the server;
rerun after source edits. PORT and HOST default to 3000 and 127.0.0.1.
No framework checkout, documentation access token or UDIOT_SOURCE variable
is needed. Documentation is local to this repository in content/docs/.
Author and verify
Add Markdown under content/docs/; the build generates navigation, headings,
sanitized HTML, a local search index and SEO pages. README.md maps to its
directory route; for example api/README.md becomes /docs/api.
Use relative Markdown links between guides. Missing local targets and duplicate
routes fail the build. Tests check generated links, assets and heading fragments.
Keep current framework metadata in content/framework.json aligned with the
installed package and app.mjs. Validate public imports and executable guide
examples from the framework checkout using npm run test:docs; the website's
own tests cover rendering, public output isolation and fixed interactive demos.
lib/ renders pages and demos, client/ progressively enhances controls,
public/ holds static assets and build/ invokes the framework generator.
dist/ and .generated/ are disposable. archives/, .planning/, .nexpec/,
source code and credentials are never public assets.
Deploy
Build and test the exact reviewed checkout before deployment:
npm ci
npm run build
npm test
NODE_ENV=production HOST=0.0.0.0 PORT=3000 npm start
Retain dist/, package.json, the lockfile, app.mjs, server.mjs, lib/
and installed production dependencies in the server image. The running server
does not need documentation source, a framework checkout, a database or provider
credentials. Serve only dist/ as public assets. Configure HTTPS and domain DNS
at the hosting provider. The verification workflow builds an artifact; it does
not deploy a site or configure DNS.
Static hosting supports documentation, search and browser examples. The DI
example requires the Node server. Apply dist/redirects.json and a real 404
response on a static host. Legacy examples, about, community, blog, quickstart
and style-guide routes have generated redirect pages.
VPS installation
The shared VPS runs this site independently of tagna.in. The deployment files
under deploy/ define a dedicated udiot-site service account, systemd unit
udiot-in.service, loopback listener 127.0.0.1:3101, and a domain-specific
Nginx virtual host. Nginx forwards one trusted proxy hop; the server accepts
TRUST_PROXY_HOPS=1 in that deployment.
Package only dist/, lib/, app.mjs, server.mjs, package metadata/lockfile
and deploy/ from a verified build. Do not include .env, credentials,
archives, planning records or the repository root. The installer validates
the archive hash, installs locked production dependencies without lifecycle
scripts, activates a release under /srv/udiot.in/releases/, and checks
readiness before adding this site's Nginx route. A failed app startup restores
the previous release when available.
Point the apex A record at the shared VPS and www at the apex. Complete
registrar verification before relying on DNS. Once public DNS resolves, issue
the certificate using the VPS's existing Certbot account and webroot at
/srv/udiot.in/acme, then activate deploy/nginx-https.conf after nginx -t.
Keep an automatic renewal hook that validates and reloads Nginx. HTTPS redirects
both the HTTP domain and www to https://udiot.in.
The website lockfile includes patched transitive dependencies. A scoped
@grpc/grpc-js override currently selects 1.13.6 because the installed
Firebase dependency otherwise selects an affected older line. Recheck the
override against upstream dependency updates and require a fresh audit and
website tests before removing it.
Smoke checks and rollback
Check /, /docs, /playground, /api/playground/di?scope=scoped,
/health/live, /health/ready and a nonexistent path returning HTTP 404.
Verify desktop/mobile navigation, search, code copying, examples, keyboard focus
and readable guides with JavaScript disabled. Inputs are bounded data for fixed
examples; the playground does not execute arbitrary submitted code.
Follow the detailed browser verification checklist.
Restore a previously verified commit and lockfile, rebuild and restart to roll back. There are no data migrations.
RC.1 replaces document-shell assets when producing an SEO head. The build currently completes the generated head with local stylesheet, favicon and script tags. Keep this compatibility step until a reviewed framework upgrade preserves those tags; HTTP tests guard the generated result.