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>
3.8 KiB
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, flashfirmware/, printcase/, runserver/, installapp/, 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 - seedocs/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 indocs/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).