1994/ghostwriter-core
Ghostwriter Core provides the shared Laravel/PHP foundations for Ghostwriter, including core services, configuration, and integration points for building AI-assisted writing workflows. It is a lightweight base package for related Ghostwriter modules.
Connections resolves keys from env/config first (always wins), then an encrypted store, behind a CredentialStore port — which means both bring-your-own-key and platform-provided-key can be supported without forking. That is a packaging and margin decision, not an engineering one. Second, the split between free checks (no model, no request) and paid AI passes (review, verifier, seo-editor, seo-verifier) gives a natural free/paid boundary: instant deterministic linting and the revisit list as the free tier, model-backed review and SEO generation as the paid tier.seo-editor call, an seo-verifier call, and a layout plan; an existing page can trigger a reviewer call plus one verifier call per part that kept anything (long pages split via ReviewInput::calls()). Caps exist (2–5 links, ~1 per 250 words, SEO reasons capped at 25 via Priority::SEO_CAP, 5,000 link rows per group / 20,000 per site), but per-action cost is now variable and multi-call. Pricing and quota design must be modelled against call counts, not drafts.QuoteFinder, ScopedEditCheck, SourceCheck, SentenceFit, SuggestionValidator) is the strongest product asset in this release: it supports a "no invented facts, every suggestion anchored to your text" claim that competitors rarely substantiate. Whether we advertise it is a deliberate positioning decision, not a default.SeoPass::suggestLinksFor() returns proposals), which is a good default to ship before any auto-apply behaviour.RevisitOptions::$externalLinks), rate-limited (one request/second/host, 10s timeout, 500/run), and only flags broken after two consecutive failures. Reuse this pattern for any other outbound feature we build — it is a reasonable template for operational risk in the editor.NOASSERTION), does not establish community adoption, and does not change the single-publisher concentration. It does show sustained, high-cadence development, which cuts both ways: less abandonment risk, more churn risk for a pinned fork. It also adds surface: encrypted credential storage (with us owning the KMS/key-rotation story, since CredentialStore is a port we implement), and outbound link probing. Legal and security scopes both grew.Consider it when:
Connections\*, Suggest\*, Revisit\*, and Seo\* independently adoptable, or is it all-or-nothing?Look elsewhere when:
NOASSERTION remains a hard stop; nothing in this release changes that.CredentialStore is a port — storing customers' provider keys encrypted, with rotation and audit, is our obligation, and a serious one.To executives (one paragraph): We are evaluating a PHP library that supplies the engine for AI-assisted editing — provider abstraction, structured drafting, credential setup, an editorial review-and-verify pipeline, content-freshness ranking, and an SEO layer covering internal links and search metadata — so our team builds the integrations and the interface, not the engine. Its latest release (v1.10.0) is the same engine behind three shipped admin surfaces (Statamic, Craft, Filament), which supports a one-investment, three-segment thesis, and it adds a free deterministic tier alongside the paid AI tier, which we can use to shape packaging. The offset is unchanged and now larger in surface area: no community adoption, unclear license, single maintainer, and new obligations around storing customer API keys. Recommendation: approve a scoped technical spike on one surface plus a parallel legal and security review; do not commit roadmap until both clear.
To engineering (short): Framework-free PHP core with explicit ports — CredentialStore, RevisitStore, EntrySource, LinkIndexContract, LinkProbe, SeoWriter, ChecksKeys — most of which we must implement. The new value is concentrated in three places worth reading closely: the review/verify loop (Studio::suggestEdits() → Studio::verifyEdits(), with QuoteFinder/ScopedEditCheck/SourceCheck anchoring every suggestion to real text), the SEO pass ordering (SeoPass::afterWriter() runs before the layout planner so every layout carries links), and Connections env-first key resolution. Note the cost profile: reviewer plus one verifier call per kept part, seo-editor plus seo-verifier per draft — instrument call counts before we quote a price. Expect to read the whole source; there is still no external usage to learn from, and the surface is now much larger than when we first scoped it. First spike question: what is independently adoptable?
To finance/legal (short): License remains NOASSERTION — read as "unknown," not "permissive"; no shipment until provenance and terms are confirmed in writing. Scope has widened on two fronts. Security: the package defines an encrypted credential store for customer provider keys; we would own encryption, rotation, and audit. Outbound traffic: opt-in external link checking (rate-limited, 500/run), model-provider calls for drafting, review, verification, and SEO, plus stock-photo APIs with attribution terms. Budget for a data-flow and key-custody review, not just a license check.
Bottom line: the strategic fit improved and the dependency got heavier. Evaluate as an acquisition-of-code on a narrow pilot — free checks plus suggest-edits on one surface — and treat the SEO layer and Connections as separately justified phases, not part of the initial commitment.
How can I help you explore Laravel packages today?