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>
58 lines
2.7 KiB
Markdown
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.
|