Liminal
Build and preview Laravel applications without leaving your browser
Install / Use
/learn @aschmelyun/LiminalREADME
Liminal
A browser-based Laravel IDE. PHP 8.4 runs entirely in WebAssembly — no server, no installs, no uploads. Write, run, and preview Laravel applications without leaving the tab.
liminal.aschmelyun.com — deployed as a static site on Cloudflare Pages. Feel free to try it out; everything you type and build is sandboxed entirely to your browser and never leaves your machine.
Features
| View | Description |
|------|-------------|
| Preview | Navigate routes and see rendered HTML output. Tailwind CSS v4 is injected automatically. |
| Code | Browse and edit project files with syntax highlighting (PHP, Blade, JS/TS, JSON, CSS). |
| Terminal | Run Artisan commands directly in the browser with command history. |
| Agent | OpenAI-powered assistant that reads/writes files and runs Artisan to build features. |
| Tools | Import from GitHub, export as .zip, sync to a local folder, and configure settings. |
Additional features:
- Share URLs — encode your file diffs into a URL; anyone who opens it gets your changes applied automatically
- Dark mode — light, dark, or system theme, persisted across sessions
- Local sync — mirror the virtual filesystem to a local folder via the File System Access API (Chrome/Edge)
Tech Stack
- Vue 3 + TypeScript + Vite
- Tailwind CSS v4
- CodeMirror 6
- @php-wasm/web-8-4 — PHP 8.4 compiled to WebAssembly
Running Locally
bun install
Before building, make sure Composer dependencies are installed inside the embedded Laravel app:
cd ../liminal/app # path to the Laravel project
composer install --no-dev --optimize-autoloader
[!NOTE] I gotta figure out a way to do this without Composer and without having to commit the whole dang vendor directory.
Then build and preview:
bun run build
bun run preview
bun run build bundles the Laravel app into public/app.zip, runs type checking, and produces the final static assets. bun run preview starts a local web server serving that output — use this rather than bun run dev when you need to test the full built artifact (e.g. WASM chunk reassembly).
Build pipeline
The build runs three steps:
bundle-app.js— zips the Laravel project from../liminal/appintopublic/app.zipvue-tsc— TypeScript type checkingsplit-wasm.js— chunks WASM files >24 MB into.wasm.part*files with a manifest, required for Cloudflare Pages' file size limit
How It Works
On boot, the app downloads app.zip and extracts it into an in-memory virtual filesystem. From that point on, all PHP execution — routing, database queries, Artisan commands — happens entirely client-side via the WASM runtime. There is no backend; the production deployment on Cloudflare Pages is purely static files.
SharedArrayBuffer is required by the WASM runtime and needs Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: credentialless headers, which are configured in both the Vite dev server and public/_headers for Cloudflare Pages.
Limitations
- No network access from PHP (no
file_get_contentsover HTTP, nocurl, no Composer) - The
vendor/directory is pre-bundled inapp.zipand cannot be modified - SQLite only — no MySQL/Postgres
- Performance is slower than native PHP, especially on first boot
License
This project is licensed under MIT, but uses php-wasm which is licensed as GPLv2. If you're cloning this project or using it in your own derivitive works, just keep that in mind!
Related Skills
node-connect
354.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
112.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
354.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
354.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
