src/content/docs/ — twelve pages totalling ~18,800 words, ported from
the omni-pca repo's docs and reference material:
index.mdx (377 w) landing page with three CardGrid links
start/quickstart.md (572 w) three flows: decode .pca / talk to
panel / install in HA
reference/protocol.md (2525 w) byte-level Omni-Link II spec, full
packet+message layouts, the two
non-public quirks, opcode tables
reference/file-format.md (1593 w) XOR-LCG cipher, key derivation,
PCA01.CFG schema, .pca PCA03 header
reference/library-api.md (1170 w) module-by-module Python API summary
reference/ha-entities.md (1070 w) per-platform entity catalogue
reference/ha-services.md (567 w) seven services + automation YAML
explanation/quirks.md (1448 w) the headline RE essay — session-key
XOR mix + per-block whitening, why
no public client documents them
explanation/architecture.md (1123 w) library + HA + mock + tests
explanation/pc-access-bug.md (1131 w) LargeVocabulary off-by-N
journey.md (6194 w) chronological retrospective ported
from omni-pca/docs/JOURNEY.md
changelog.md (1213 w) full 2026.5.10 release notes
Dockerfile — pinned node:lts-alpine and caddy:latest (registry-1
.docker.io was returning 'tls: internal error' on node:25-alpine and
caddy:2-alpine pulls; the pinned tags are cached locally and work).
TODO comment notes to bump back to node:25 once registry stabilises.
.gitignore — added .env / .env.local just in case.
Build: 13 pages built clean in 1.83s, sitemap + Pagefind search index
emitted. Container runs at hai-omni-docs-docs (caddy network), accepts
requests with Host: hai-omni-pro-ii.warehack.ing, returns rendered
Starlight HTML with title/description meta intact. Once DNS for
hai-omni-pro-ii.warehack.ing points at the host, the site is live.
40 lines
926 B
Docker
40 lines
926 B
Docker
# syntax=docker/dockerfile:1.7
|
|
|
|
# ---- builder ----
|
|
# Pinned to lts-alpine so it works against Docker Hub's cached image set.
|
|
# Bump to node:25-alpine when 25 stabilises in the registry.
|
|
FROM node:lts-alpine AS builder
|
|
|
|
ENV ASTRO_TELEMETRY_DISABLED=1 \
|
|
NODE_ENV=production \
|
|
CI=true
|
|
|
|
WORKDIR /app
|
|
|
|
# Install deps in their own layer for better caching.
|
|
COPY package.json package-lock.json ./
|
|
RUN --mount=type=cache,target=/root/.npm \
|
|
npm ci --include=dev
|
|
|
|
# Copy the rest of the source and build.
|
|
COPY . .
|
|
RUN npm run build
|
|
|
|
# ---- runtime ----
|
|
FROM caddy:latest AS runtime
|
|
|
|
# Run as non-root.
|
|
RUN addgroup -S docs && adduser -S -G docs docs
|
|
|
|
WORKDIR /srv
|
|
|
|
COPY --from=builder /app/dist /srv
|
|
COPY Caddyfile /etc/caddy/Caddyfile
|
|
|
|
# caddy:2-alpine ships with a sane default user model; keep ports unprivileged.
|
|
EXPOSE 80
|
|
|
|
USER docs
|
|
|
|
CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
|