openscribe/site/README.md
Laurence 8fd9b694f8
Some checks failed
ci / firmware (pull_request) Failing after 31s
ci / openapi (pull_request) Failing after 33s
ci / emulator (pull_request) Failing after 24s
ci / server (pull_request) Failing after 37s
docs+site: Nightjar brand, hosted service, infrastructure plan, saved site
Persists the branding/commercial/infrastructure work (previously only in chat and
on the live site) into version control.

What changed:
- docs/naming.md: due-diligence and the decision to brand the product Nightjar
  (OpenScribe domain/GitHub/trademark collisions; alternatives screened; why Nightjar).
- docs/hosted-service.md: the commercial model - plan tiers (Self-host / Cloud
  Starter / Cloud Pro / Private), indicative pricing, backend mapping, and the
  build-to-sell roadmap (metering, billing, provisioning, DPA).
- docs/infrastructure.md: backend infra plan. Primary option = self-host on the
  3x Minisforum MS-02 cluster (one with an RTX 3050 6GB) fronted by a Cloudflare
  Tunnel, with node roles, the 3050 capacity reality, caveats, and a Hetzner cloud
  fallback. Provision-later.
- site/: reproducible marketing-site source - block content for all 11 pages
  (rebranded to Nightjar), the navigation, the Contact Form 7 config (honeypot),
  the ApisCP SOAP helper (tools/apiscp.php, no secret), and a README on how the
  WordPress site is built and managed via the API.
- state/: DECISIONS (Nightjar rebrand, hosted service, MS-02 backend), PROJECT
  (brand + commercial section), TODO (rename decision, trademark, mailbox, pricing,
  hosted-service build, infra provisioning).

Why:
- User asked to save everything to the repo. Captures the product rebrand, the
  commercialisation plan, and the infrastructure decision so a cold session has the
  full picture.

Notes:
- The repo is still named `openscribe`; the product/brand is Nightjar. A full
  codebase rename is deferred (tracked in TODO + docs/naming.md).
- No secrets committed: the ApisCP API key is read from a local scratch file, never
  the repo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:24:24 +01:00

58 lines
2.7 KiB
Markdown

# Nightjar marketing site
The content and tooling for the public marketing site at
**https://nightjar.12hobbies.studio** (the commercial front for the project; see
`../docs/hosted-service.md`).
The live site is **WordPress on ApisCP** (`howler.qsplace.co.uk`, EU/Hetzner), on the
`12hobbies` account as a subdomain. This directory is the reproducible source: the page
content, navigation, contact-form config, and the tooling used to push it all through the
ApisCP API.
## Layout
```
pages/ Block-editor content for each page (one file per page)
home.html front page (landing)
how-it-works.html workflow + architecture diagrams (inline SVG) + detailed steps
bring-your-own-ai.html
guides.html hub linking the three tutorials
connect-your-ai.html tutorial: per-provider .env config
self-host-the-server.html tutorial: install -> configure -> run
build-the-device.html tutorial: parts, flashing, case (+ device illustration)
open-source.html hosted-plans.html about.html contact.html
_navigation.html the header navigation (wp_navigation block content)
cf7-form-config.php Contact Form 7 form template + mail config (honeypot spam protection)
tools/apiscp.php SOAP helper that drives ApisCP / wp-cli remotely (see below)
```
Images are **inline SVG** inside Custom HTML blocks (no uploads, no SVG-upload security
concerns; the device illustration has an animated status light).
## How the site is managed
WordPress is driven remotely through the ApisCP SOAP API via `tools/apiscp.php`, which
exposes `wordpress_cli` (wp-cli) and file operations. Page content is pushed to a temp
file on the server and applied with `wp post update <id> <file>` (avoids command-length
and quoting limits). Example:
```
php -d extension=openssl -d extension=soap tools/apiscp.php \
file_put_file_contents /var/www/<docroot>/.tmp.html '@@pages/home.html' true false
php -d extension=openssl -d extension=soap tools/apiscp.php \
wordpress_cli 'post update <id> /var/www/<docroot>/.tmp.html' '[]' nightjar.12hobbies.studio ''
```
### Secrets
`tools/apiscp.php` reads the ApisCP API key from a local scratch file
(`C:/temp/claudetemp/apiscp.key`) that is **never committed**. Supply the key out-of-band
and keep it out of the repo. The `.gitignore` already excludes secrets.
## Site facts
- Comments are disabled site-wide (Disable Comments plugin + closed defaults).
- The contact form is Contact Form 7 with a hidden **honeypot** field for spam protection;
every submission is also stored in the database via Flamingo.
- TLS is Let's Encrypt (valid cert for `nightjar.12hobbies.studio`). The old
`openscribe.12hobbies.studio` host redirects here.