openscribe/state/PROJECT.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

75 lines
3.8 KiB
Markdown

# Project: OpenScribe
> The anchor document. A session that reads only this, TODO.md and DECISIONS.md should
> understand what the project is and what to do next. Keep it current.
## Objective
An open-source, self-hosted AI voice recorder in the style of the Plaud Note / NotePin:
a small wearable device that records audio to local storage, syncs to a mobile app and
to a self-hosted server, and produces transcripts and summaries, with a completely open
API so the owner controls their data end to end. No proprietary cloud, no lock-in.
## Scope
- In scope:
- Firmware for an ESP32-S3 recorder (audio capture, storage, power, controls).
- Three sync paths: BLE control, WiFi bulk transfer to the app, and independent WiFi
upload to cloud storage when on charge / hard-powered (no phone present).
- A completely open, documented REST API (device and server) with an OpenAPI spec.
- A self-hosted AI stack: transcription (faster-whisper) and summarisation (local LLM
via Ollama), plus export in multiple formats.
- A Flutter mobile app (Android + iOS).
- A parametric 3D-printed case (OpenSCAD) plus a hardware BOM and wiring guide.
- Out of scope (for now):
- A custom PCB (v1 uses off-the-shelf modules on protoboard / carrier).
- Cloud SaaS hosting. Everything runs on hardware the user owns.
- Real-time on-device transcription (server does the AI; device just records + syncs).
- Speaker diarisation (deferred; noted as a later enhancement).
## Audience
Makers and privacy-minded users who want a Plaud-like capture-and-summarise workflow
they fully own: build the device from the BOM, print the case, run the server on a NAS
or mini-PC, install the app, keep every recording and transcript on their own kit.
## Description
The device records voice to microSD as WAV (compressed codecs optional later). On
battery it advertises over BLE for control and hands bulk transfers to WiFi. When placed
on charge or hard-powered it becomes autonomous: it joins configured WiFi, serves its
REST API on the LAN, and uploads new recordings to generic cloud storage (S3-compatible,
e.g. self-hosted MinIO, or WebDAV/NAS). A self-hosted server ingests recordings,
transcribes them with faster-whisper, summarises with a local LLM, and exposes an open
API with exports (audio, TXT, SRT/VTT, Markdown, JSON). The Flutter app provisions the
device, browses the library, plays audio and shows transcripts and summaries.
## Success criteria
- A person can build the device from `hardware/BOM.md`, flash `firmware/`, print
`case/`, run `server/`, install `app/`, and capture -> transcribe -> summarise -> export
a recording without any proprietary service.
- Every recording is retrievable and exportable through the open API.
- The device syncs three ways as specified (BLE, WiFi-to-app, independent WiFi upload).
- The whole stack is self-hostable and licensed for open reuse.
## Brand and commercial (2026-07)
- **Product brand: Nightjar** (the repo is still named `openscribe`; rename deferred - see
`docs/naming.md`).
- **Marketing site:** live at https://nightjar.12hobbies.studio (WordPress on ApisCP;
content + tooling saved in `site/`).
- **Commercial model:** open project + a managed "hosted" backend with plan tiers
(`docs/hosted-service.md`); backend infra plan in `docs/infrastructure.md` (self-host on
the MS-02 cluster, provision later).
## Key facts
- Trunk branch: `main`
- Forge / remote: https://git.discworld.casa/laurence/openscribe
- Runtime / stack:
- Firmware: C++ (Arduino-ESP32) via PlatformIO, target ESP32-S3.
- Server: Python (FastAPI) + faster-whisper + Ollama + object storage (MinIO/local).
- App: Flutter (Dart), Android + iOS.
- Case: OpenSCAD. CI: Forgejo Actions (self-hosted runner).
- How to run it: see `state/NOTES.md` (per-component build/run commands).