saa e09444015e
InboxOS — PR CI / Fast offline tests (pull_request) Failing after 28s
InboxOS — PR CI / 100MB historical e2e (pull_request) Successful in 11m14s
InboxOS — PR CI / Live Ollama extract smoke (pull_request) Successful in 48s
SAA: Pillar I Roadmap v1 — MAJOR scope + MINOR release list + Goals/Initiatives
Retroactive v1 application of the MAJOR Initiative umbrella model per CEO
Option 2 (non-breaking for shipped MINORs; governance enforced moving forward).

- Add ## MAJOR scope declaration: this Roadmap represents the complete
  delivery of v1.x.
- Add ## MAJOR Umbrella section: the Gitea umbrella Issue is the single
  audit anchor; binding populated on first Pillar I Gate passage.
- Add ## MINOR release list with descriptive names (v1.0 - MVP Foundation,
  v1.1 - Beta Cohort, v1.2 - Initial Pipeline Hardening, v1.3 - Stable Cut,
  v1.4 - Operator UX + Security Hardening, Backlog). Names are the
  canonical form for new Gitea Milestones; legacy Milestones stay intact
  (non-breaking) and pick up the major/v1 label.
- Add ## Goals (verbatim, with source links) — drawn from the CPO- and
  CTO-authored Gitea Issues; the SAA does not paraphrase.
- Add ## Initiatives (4 Initiatives, 9 Epics): INTV-1 Operator Self-Service,
  INTV-2 Security & Compliance, INTV-3 Dual-Approval Governance, INTV-4
  Tech-Debt Lane. Each Initiative traces to a stated Goal.
- Add ## Success criteria and ## Out of scope for the MAJOR as a whole.
- Add Sequencing principle 6 (Governance before speed) per INB-328.
- Retain CPO authorship of the milestone timeline; retain the existing
  ## Milestones, ## Sequencing principles, and ## Change log.

Pillar I Gate pending: this PR is the artifact for the CPO to review and
merge. On merge, the SAA runs SOP §6 to create the major/v1 label, the
MAJOR v1 umbrella Issue, the Backlog Milestone, the release/v1 branch, and
the Initiative/Epic Issue tree (all sub-issues, all with the metadata
matrix populated). The umbrella is blockedBy this PR.

Refs: inboxos#18 (v1.4 IDEATE), inboxos#24 (v1.4.0 re-dispatch / INB-328
P0 governance defect), INB-123 (board mandate initializing the Roadmap),
INB-171 (tooling governance), INB-295 (v1.3.0 recovery), INB-319 (v1.4
IDEATE pre-build), INB-328 (P0 governance defect).
2026-06-09 17:39:46 +00:00

InboxOS

Self-hosted personal ERP / CRM pipeline. A single Gmail inbox, polled over IMAP, archived to SeaweedFS, classified and extracted by a local LLM (Ollama), and written to NocoDB as structured records. Curated attachments are mirrored to Papra. No third-party SaaS touches PII.

Where to start

  • 30-minute walkthrough — docs/operator-tutorial.md (REQ-INB-53). Guided tour for the new operator: setup → first run → day-to-day → incident response → hardening.
  • Operations runbook — docs/operations-runbook.md. System overview, service inventory, workflow operations, observability, failure modes, security, cost, glossary. The first thing to read on day 1 of incident response.
  • Extraction contract — docs/extraction-contract.md. How a raw email becomes a NocoDB record. Source of truth for the inboxos:classify + inboxos:extract-<module> prompt family.
  • NocoDB schema — docs/schemas.md. The four module tables (finance, crm, intel, promotions) and the Message-ID idempotency contract.
  • Gitea Actions setup — docs/gitea-actions.md. Runner provisioning (including the second runner for live + historical parallelism), repo secrets, the Basic Auth model.
  • Pipelines — pipelines/README.md. Flow diagrams, idempotency model, rollback procedure for the live and historical pipelines.
  • Papra write policy — docs/papra-write-policy.md. When the pipeline writes to Papra (attachments + selected bodies), and why the first ship is dry-run.

Quick layout

inboxos/
├── README.md                     # this file
├── .env.example                  # placeholder env (no real secrets)
├── docker/
│   └── docker-compose.yml        # self-hosted stack: gitea, runners, nocodb, seaweedfs, papra, ollama
├── .gitea/workflows/
│   ├── live-pipeline.yml         # cron */5 * * * *, polls IMAP
│   ├── historical-pipeline.yml   # workflow_dispatch, streams .mbox
│   └── ci-pr.yml                 # fast-tests + 100MB e2e + live Ollama smoke
├── pipelines/                    # shared Python: common.py, live_pipeline.py, historical_pipeline.py, mbox_stream.py
├── .opencode/commands/           # version-controlled extraction prompts (prompt-as-code)
├── config/                       # n8n config (legacy, no longer in use)
└── docs/                         # this runbook + schemas + contracts + reports

Status

Phase 5 — Full Deployment. Parent goal: INB-1. Current phase issue: INB-7. The runbook in docs/operations-runbook.md is the canonical reference for ongoing operation.

Historical archive (Google Takeout .mbox)

The full Google Takeout .mbox export lives in SeaweedFS at the canonical S3 URI:

s3://inboxos/eml/historical/all-mail.mbox

That is the value to pass as the mbox_object_key workflow_dispatch input to historical-pipeline.yml. To verify it exists, run from any host with mc configured against the inboxos bucket:

mc ls --recursive inboxos/inboxos/ | grep '\.mbox$'

The historical pipeline streams this object message-by-message, UPSERTs each into NocoDB on Message-ID, and writes the raw .eml backup under s3://inboxos/eml/historical/<yyyy>/<mm>/<dd>/<Message-ID>.eml. See docs/operations-runbook.md §3.2 for the dispatch recipe and §4.4 for the full bucket layout.

S
Description
InboxOS — self-hosted personal ERP/CRM pipeline. Prompts-as-code, Gitea Actions, NocoDB, Ollama, SeaweedFS, Papra.
Readme 1.8 MiB
Languages
Python 90.3%
Shell 9.7%