by tedydonel
A block-based content engine and bilingual blog backend for Laravel Gutenberg-style editor, media library, post templates, roles, and an AI writing assistant, with zero host coupling.
Unlocks once the catalog security scan passes (runs nightly).
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
# Add to your Claude Code skills
git clone https://github.com/tedydonel/HeisenbergGuides for using ai agents skills like Heisenberg.
Heisenberg has no users, no theme lock-in and no frontend framework. Your app keeps its users, its routes and its pages — Heisenberg brings the editor at /editor, the content model, and narrow contracts you bind to make everything yours.
composer require heisenberg/heisenberg
php artisan migrate
php artisan storage:link # public media URLs (the uploads link is pre-registered)
That's it — open /editor. The service provider is auto-discovered, migrations load automatically, and every seam ships a working default. On a machine where APP_ENV=local, everything works anonymously out of the box; real deployments authorize through your own users (below).
Optional but recommended:
composer require intervention/image:^3.9 # responsive image variants (v4 is NOT compatible)
Heisenberg never creates users. Your existing users get abilities through the RoleGate contract, with four canonical roles — WordPress-familiar:
| Role | Can |
|---|---|
admin |
everything, including AI/provider settings |
editor |
publish, schedule, archive; manage anyone's media |
author |
write and draft; upload media; edit own files |
viewer |
browse and pick media, read-only |
The bundled gate reads either Spatie permissions (getRoleNames()) or a plain role string column on your user model:
Schema::table('users', fn (Blueprint $t) => $t->string('role')->nullable());
// then: $user->role = 'editor';
Different role names in your app? Remap them in config/heisenberg.php under roles, or bind your own RoleGate implementation entirely. Production apps should also wrap the route groups in their own auth middleware (heisenberg.middleware.editor / .media / .ai, all default ['web']).
Heisenberg renders block content; you own the page around it. A post template is a JSON contract declaring which chrome capabilities the page has — featured image, authored table of contents, reading time, breadcrumbs, share buttons, comments, and more:
// config/heisenberg.php (php artisan vendor:publish --tag=heisenberg-config)
'template_root' => resource_path('heisenberg-templates'),
// resources/heisenberg-templates/mysite/mysite.json
{
"name": "heisenberg/mysite",
"render": { "view": "blog.show" }, // YOUR Blade view
"capabilities": {
"featuredImage": { "enabled": true, "source": "post-attribute", "context": "hero" },
"tableOfContents": { "enabled": true, "source": "entries" },
"comments": { "enabled": true, "allowGuests": true, "sortOrder": "newest" }
}
}
Validate with php artisan templates:verify. In your controller, resolve PostTemplateRegistryService from the container, read the contract, and render the body exactly like the built-in preview does (BlockRenderer::renderBlocks() plus the block/theme stylesheets). The full schema — all 11 capabilities and the render-vs-adapter decision for each — is in docs/post-template-schema.md.
Data Heisenberg doesn't own arrives through provider contracts with null defaults — bind yours in the published config:
'post_template' => [
'comments_provider' => App\Support\MyCommentProvider::class, // implements PostCommentProvider
// post_views_provider, related_posts_provider, seo_meta_provider
],
en/fr UI.VirusScanner contract), collision-safe naming (photo(1).jpg), role-scoped permissions.docs/code-view.md).php artisan vendor:publish --tag=heisenberg-config gives you config/heisenberg.php: table names and model classes (all swappable), role map, lifecycle transitions, media rules (size caps, allowed extensions, virus scanner), template root, AI provider settings, and the middleware stacks for each route group. Every contract (RoleGate, MediaResolver, VirusScanner, AuditSink, IconProvider, the four template providers) is a config-named binding with a working default.
docs/media-library-backend-blueprint.md for the web-server hardening snippets).APP_ENV=local.| Doc | What it covers |
|---|---|
docs/BLUEPRINT.md |
The full specification — every class, column, contract key and security gate |
docs/block-schema.md |
Writing block contracts |
docs/post-template-schema.md |
Writing post templates |
docs/code-view.md |
The shortcode dialect |
docs/media-library-backend-blueprint.md |
The media subsystem, end to end |
docs/ai-mcp-plan.md |
The AI assistant and MCP integration |
PHP ^8.2 · Laravel 11 / 12 / 13 · Livewire ^4.3
Heisenberg is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by tedydonel. A block-based content engine and bilingual blog backend for Laravel Gutenberg-style editor, media library, post templates, roles, and an AI writing assistant, with zero host coupling. It has 56 GitHub stars.
Heisenberg's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/tedydonel/Heisenberg" and add it to your Claude Code skills directory (see the Installation section above).
Heisenberg is primarily written in PHP. It is open-source under tedydonel on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh Heisenberg against similar tools.
No comments yet. Be the first to share your thoughts!