The platform, with the back panel off.
BusinessPress is a Laravel application with dual GraphQL APIs, an MCP server, a real-time reactive cache, and a model-alias extension system. Self-host or hosted. Apache 2.0 core. PRs welcome.
$ git clone businesspress/core
$ composer install
$ php artisan bp:install
$ composer dev
# → http://localhost
Built on
The APIs land in a real operator dashboard.
BusinessPress is not a headless toolkit with a thin admin bolted on. The MCP server, AI providers, page builder, image studio, commerce, and notification logs all surface in the same dashboard your team uses every day.
Dual GraphQL.
One model layer.
Two endpoints. Same Eloquent models. Storefront fields are explicitly opted in via
storefront: true
on the #[NativeRelationship] attribute.
Public · cached · no auth
POST /graphql/storefront
For your storefront, mobile app, or any public surface. Field-level opt-in. Cached at the edge via RSC.
products(first: 5, orderBy: "sales_desc") {
id name price { format }
}
}
Auth · Sanctum · scoped to user
POST /graphql/dashboard
Full read/write surface for your dashboard. Every query and mutation runs through canAccess().
updateLead(id: $id, stage: "PROPOSAL") {
id stage updated_at
}
}
9 tools.
One protocol.
Model Context Protocol server at POST /mcp,
protected by auth:sanctum.
Every tool call routes through the same canAccess()
scope your dashboard uses. Mutations require a confirmation step by default.
introspect_schema
Discover entity types, fields, mutation inputs
list_entities
Paginated listing with filters
get_entity
Fetch single entity by UUID
search_entities
Full-text search
create_entity
Create with confirmation step
update_entity
Update with diff preview
delete_entity
Delete with confirmation
upload_file
From URL or base64 → upload_id
execute_graphql
Raw GraphQL escape hatch
Plus the Page Builder Code Agent ships 17 additional VFS tools (write, view, find-replace, apply-diff, query, undo, save-state, refresh-preview, …) for autonomous template editing loops.
Postgres writes.
Browsers update. Sub-second.
The RSC pipeline streams Postgres writes through a ReadySet WAL listener, into Redis, out via Reverb, straight to a Laravel Echo client. Optional — bring your own broadcaster or turn it off entirely.
Override anything.
Touch nothing in core.
Every model has a stable $modelAlias.
Polymorphic columns store aliases ("order") — never class paths.
Drop a class with the same alias in app/Models
and it wins.
Same goes for CPTs (definitions/cpts/*.php),
WEF schemas (wef-json/*.json),
and dashboard pages (Livewire components in app/Livewire/Dashboard/Pages/).
namespace App\Models;
use BusinessPress\Core\Models\Order as BaseOrder;
class Order extends BaseOrder
{
protected static $modelAlias = 'order'; // same alias wins
public function customSummary(): string
{
return "#" . $this->id . " · " . $this->customer->name;
}
}
115 of 122 core models register an alias. Polymorphic relations resolve at runtime through the
ModelRegistry. Your override is plug-and-play.
Same image. Your infra.
BusinessPress is the same Docker image whether we host it for you or you host it yourself. No premium-feature gating, no different SKU.
- Bring your own Postgres ≥ 14 + Redis ≥ 6
- Octane-ready · works with FrankenPHP, Swoole, or php-fpm
- Optional ReadySet for the RSC reactive layer
- Optional Reverb (or Pusher / Soketi) for WebSockets
- Optional Node.js sidecar for the AI assistant
services:
app:
image: businesspress/core:latest
env_file: .env
depends_on: [postgres, redis]
postgres:
image: postgres:16
volumes: [pgdata:/var/lib/postgresql/data]
redis:
image: redis:7-alpine
reverb:
image: businesspress/reverb:latest
volumes:
pgdata:
Honest numbers
115
models with stable aliases
9
MCP tools out of the box
17
Code Agent VFS tools
3
AI providers, swappable
Want to dig deeper?
Full API reference, deployment guides, and architecture deep-dives.