The control room for a company’s content.
An AI-native orchestration layer for digital operations. Praxis connects the systems an organization already runs, starting with WordPress, and adds a canonical content model, metered AI drafting, and enterprise search behind one API.
v0.2 · The machine drafts, a human approves. Thirteen services on one VPS.
Most platforms ask you to migrate. Praxis connects: WordPress stays where the authors are, the platform holds the canonical model, and AI and search operate on that.
-
Provenance first
Every item is tagged by origin: WordPress, platform, or an AI draft nobody has reviewed yet. A machine’s draft is never mistaken for a decision.
-
AI with a meter
Every generation is costed in integer micro-cents against a budget, with versioned prompts. AI spend is never a surprise.
-
Search that keeps up
OpenSearch consumes the platform’s event stream: highlighted full-text in about 90 ms, edge-ngram autocomplete, zero-downtime reindexes.
Shipped and verified
What it does today, end to end.
Each capability verified against the live public endpoints, not a demo reel.
- Register, log in, session: RS256 JWTs in httpOnly cookies
- AI drafts land in review, metered per generation: the OpenAI provider runs live
- Submit → approve or send back, with a written reason: approval is the publish
- Every review decision recorded in an audit ledger: who, when, and what they said
- WordPress post → webhook → board → searchable, automatically
- Full-text search with highlights across every origin
- Health endpoint with every dependency reporting green
- One-command Docker Compose deploy behind Traefik TLS
Engineering that shows its work.
The same standards we sell to clients, applied to our own product and documented as it was decided.
-
A monolith with discipline
Modular monolith with domain-driven layering and architecture tests that enforce the module boundaries. Twelve ADRs record every consequential decision.
-
Events you can trust
Transactional outbox, RabbitMQ topic exchange, CQRS-style read models: the search index can always be rebuilt from the source of truth.
-
Tenancy that can’t leak
Multi-tenant from day one with non-bypassable global-scope isolation, because bolting isolation on later never ends well.
-
Security as a posture
Rotating refresh tokens with reuse detection, HMAC-signed webhooks, breach-checked passwords, stored-XSS prevention.
Under the hood
The stack, plainly.
Chosen for operational honesty: every piece runs today on one 8 GB machine, and every piece scales past it.
- Backend
- Laravel FrankenPHP Horizon Eloquent php-amqplib predis opensearch-php Flysystem S3
- Frontend
- Next.js 16 (App Router) React 19 Server Components TypeScript (strict) Tailwind CSS v4 TanStack Query Zustand Zod Radix UI
- Data · search · messaging
- MariaDB Redis RabbitMQ OpenSearch MinIO
- Infrastructure
- Docker Compose Traefik GitHub Actions Turborepo + pnpm Prometheus Grafana
- AI
- OpenAI API behind a provider port Integer micro-cent cost metering Prompt versioning
- API · contract
- OpenAPI 3.1 as source of truth Generated TS types + CI drift gate RFC 9457 Problem Details HMAC-signed webhooks
- Quality
- Pest / PHPUnit PHPStan level 6 Laravel Pint Vitest + Testing Library ESLint Architecture tests
Changelog
Release by release.
Semantic versions, Keep-a-Changelog format, and the bugs admitted alongside the features: the way a changelog should read.
-
v0.2.0: Review, and real AI.
Content now moves through an explicit approval step before it can publish, and the OpenAI provider runs live: production-tested, no longer leaning on the deterministic fake outside development.
- Review & approval workflow: nothing reaches WordPress without a person saying yes; approving is the publish, and every decision lands in a review ledger
- A review queue: anything awaiting a decision surfaces as the highest-acuity obligation, with an In-review filter
- AI drafts open their own review: “a model wrote this and nobody has checked it” is an explicit, surfaced state
- The OpenAI provider tested against a faked HTTP client: every error mapping covered with no key and no network
- Fixed: the AI cost table read ten times too high, corrected against real pricing and re-pinned in the tests
-
v0.1.0: Foundation.
The complete walking skeleton, deployable to a single VPS with docker compose: authenticate, generate with AI, sync WordPress, search it, observe the system.
- Identity and multi-tenancy: RS256 cookies, rotating refresh tokens with reuse detection, non-bypassable organization scoping from the first migration
- Canonical content model with WordPress as an authoring adapter behind a repository port: signed webhooks, hash-based drift detection
- AI gateway with integer-precise cost metering, per-organization daily budgets, and prompt versioning
- OpenSearch as a rebuildable read model: outbox → RabbitMQ → indexer, edge-ngram type-ahead, alias-swap reindexes
- Observability, contract-first OpenAPI 3.1 types with a CI drift gate, and twelve Architecture Decision Records
Try it
Walk the board yourself.
A demo organization with clearly labelled demonstration content, including an AI draft sitting in review, exactly as an operations lead would find it.
- demo@praxis.codecharmer.io
- password
- ward-board-praxis-2026
Shared demo credentials for a sandbox organization. It is reset from time to time, so anything you add may disappear.
Straight answers.
Why put WordPress under an AI platform?
Because organizations have years of content and workflow there. Praxis treats WordPress as an authoring adapter behind a port: the canonical model lives in the platform, so AI and search never depend on any one CMS’s schema. That decision is written down as ADR 0002.
Is the RAG / embeddings layer live?
Not yet, and we won’t claim it before it ships. The architecture reserves the seams (provider ports, a vector-search slot); v0.2 spent its effort on the review workflow and hardening the live OpenAI provider instead. Everything listed on this page is verified against the live endpoints.
Can it really run a company’s content operation?
It’s a foundation, not a finished ops suite. What it proves is the hard part: the event-driven spine, tenant isolation, cost metering, CMS integration. And as of v0.2, an approval workflow where a human decision gates every publish.
Want a platform with this kind of spine?
Praxis is how we build when nobody is constraining us. A short conversation is usually enough to see whether your project deserves the same treatment.