AI assist, your own key
Generate and refactor code inline with ⌘K. Bring your own OpenAI or Anthropic key — no token markup, no middleman, and your prompts go straight from your machine to the provider you chose.
PHPTinker is a desktop scratchpad for PHP and Laravel developers. Spin up your app's full kernel in milliseconds, run any expression with FQCN-aware autocomplete, and stream output the moment it prints — no artisan tax, no throwaway routes.
// Trial cohort, grouped by activation platform $users = App\Models\User::query() ->where('plan', 'pro') ->whereDoesntHave('subscription', fn($q) => $q->active()) ->with('latestActivation') ->get(); $users->groupBy(fn($u) => $u->latestActivation?->platform ?? 'never') ->map->count()
Illuminate\Support\Collection { "darwin" => 24, "win32" => 11, "linux" => 4, "never" => 9, }
Every PHP team keeps a folder of half-finished scratch.php files. Or a tab of php artisan tinker waiting to boot. Or a controller they swear they'll delete. PHPTinker replaces all of that with one fast, focused window.
Open a buffer. Point it at a project. Hit ⌘⏎. PHPTinker boots your app's real kernel — not a stub, not a sandbox — and runs your code against the same models, providers, and config that production sees. The last expression is auto-dumped, REPL-style. Output streams live.
It's the tool we wished we had after the tenth time we wrote echo, die in a controller just to see what an Eloquent relationship returned.
php artisan tinkerSame idea — boot your app, run a line. PHPTinker is what it looks like as a real desktop product instead of a terminal wrapper.
| Capability | PHPTinker | php artisan tinker |
|---|---|---|
| App boot time | ~12 ms (cached kernel) | ~1.4 s, every session |
| Multiple project tabs | Each with its own kernel | One shell at a time |
| FQCN-aware autocomplete | Monaco + composer index | None |
| Live streaming output | Line-by-line, unbuffered | Buffered until done |
| Pretty-printed Laravel types | Collections, models, dates | Basic var_dump |
| Real code editor | Monaco — the VS Code engine | readline prompt |
| Persistent buffers & state | Saved on disk | Lost on exit |
| AI assist (bring your own key) | Generate & refactor in place | None |
| Uses your own PHP binary | Yes | Yes |
| Offline & zero telemetry | Yes | Yes |
Everything you need to debug, prototype, and explore — without leaving your editor mindset.
Generate and refactor code inline with ⌘K. Bring your own OpenAI or Anthropic key — no token markup, no middleman, and your prompts go straight from your machine to the provider you chose.
Each tab carries its own buffer, project root, output stream, and class index. Run two Laravel projects side by side without context-switching your shell.
Loads bootstrap/app.php, calls the console kernel's bootstrap(), sets sane $_SERVER defaults, and bumps memory to 512 MB. Providers and facades bind exactly as in production.
Monaco-powered editor that knows every class composer knows about — PSR-4 and classmaps. Start typing Custo… and let it write the namespace for you.
End your buffer with an expression and it's pretty-printed. End with a statement and it isn't. Exactly what you'd expect from a real REPL.
Output is unbuffered and flushed line-by-line. Long-running scripts, progress dumps, infinite loops — visible the instant they print, never the moment they finish.
Custom printers for Illuminate\Support\Collection, Eloquent models, DateTimeInterface, and Stringable. No more wading through a recursive var_dump of a hydrated relation.
QueryException shows the offending SQL and bindings. Stack traces are walked through $previous. Each frame is capped at 8 lines so the real cause stays on screen.
The class scanner runs silently the first time, then re-runs only when composer install changes anything. Cached for 24h, on disk, per project.
Raw PHP for one-off snippets, composer-only for non-Laravel codebases, and full Laravel mode when a kernel is detected. Mode switches are automatic, never forced.
PHPTinker spawns the php binary you point it at — Homebrew, Herd, Valet, php-fpm wrappers. No bundled runtime, no version mismatch, no surprises.
All tabs, buffers, and project bindings are saved on disk. Quit mid-investigation and pick up exactly where you left off — including selected projects and scroll position.
No accounts to run the app. No code uploaded. License validation is the only network call, and it carries nothing but a key, a machine ID, and a version.
The real win isn't a faster boot — it's the rituals you stop performing because they're no longer necessary.
Every PHP team has a routes/dev.php graveyard. PHPTinker eliminates the temptation: writing a one-off query against your real models is faster than scaffolding a route, every single time.
Test a migration's effect on real data. Confirm a relationship eager-loads what you think. Verify a queue job's payload against the actual app boot, not a mock that lies. The cost of being sure goes from minutes to seconds.
Writing PHP against your codebase used to require a route, a controller, a view, a refresh. PHPTinker collapses that into one buffer and one keystroke. Thinking time stops being dominated by tool overhead.
Bundled runtimes mean version drift. PHPTinker uses the same php binary your app does — same extensions, same ini, same vendor — so what runs in PHPTinker runs in production, byte for byte.
You already know what PHPTinker is for. Here's where it earns its keep.
Hydrate a model, dump the relationships, count the queries. Catch N+1s and missing indexes before code review does.
Run that UPDATE as PHP, with an each() and a dry-run wrapper, instead of typing it directly into psql. Reversible, observable, dumpable.
Pull a class from vendor/, instantiate it, see what its public surface actually looks like — without grepping README files.
Paste the production payload, run the controller's logic line by line, watch state mutate. Faster than spinning up a failing test.
An ideal classroom tool — students write code against a real app, see real output, without learning artisan, routing, or HTTP first.
Try the service. Try the action. Try the value object. See which shape feels right against real data before you commit to a class.
PHPTinker is in private beta. Here's what the first developers using it day to day have told us.
"It replaced the three scratch.php files I kept reopening. I haven't written a throwaway route since I installed it."
"The boot speed is the thing. By the time artisan tinker would've finished loading, I already have my answer and I'm onto the next query."
"Streaming output plus real autocomplete on my own models. It feels like the REPL Laravel should have shipped with."
"Pretty-printed Collections and models, right there. I stopped wrapping everything in dd() just to read it."
"Two projects open in tabs, each with its own kernel. This is how I debug now — no more spinning up a failing test to check one thing."
One license, all platforms. No subscriptions, no seat traps, no usage meters. Early joiners get the best price we'll ever offer — and a free year if they sign up now.
PHPTinker is in active development. Join the waitlist and when we launch you'll receive a complimentary 1-year license — no credit card, no strings.
Whichever your project uses. PHPTinker doesn't bundle a runtime — it spawns the php binary you point it at. PHP 8.1 and up are tested; older versions usually work for raw and composer modes.
No. PHPTinker has three modes: raw PHP, composer-only (autoloads vendor/ for any package-using project), and Laravel (boots the kernel). Mode is auto-detected from the project on disk — you can't accidentally pick the wrong one.
They run in composer mode — autoload is loaded, the rest of the boot is up to you. Symfony users typically require their kernel boot script in the buffer; we ship a snippet for it.
Once, to validate your license. After that, certificates are signed and verified offline for up to a week before re-checking. Your code, project paths, and outputs are never transmitted. Ever.
You bring your own API key (OpenAI or Anthropic). When you trigger AI with ⌘K, the request goes directly from your machine to the provider you configured — PHPTinker is never in the middle, so there's no token markup and nothing is logged on our side.
AI is entirely opt-in. Leave the key field blank and PHPTinker behaves exactly like a fast, local REPL with no network calls beyond license validation.
Artisan tinker is a CLI wrapper around PsySH that boots Laravel for every session — the boot tax adds up fast, and you're working in a terminal with no tabs, no editor affordances, no streaming, and no autocomplete on FQCNs.
PHPTinker is a desktop window with persistent buffers, real autocomplete, instant boot, pretty-printed output for real Laravel types, and a working clipboard. It's what tinker would look like if it were a product, not a command.
macOS (Apple Silicon & Intel) ships today. Windows and Linux builds are signed and stable in beta — install them from the same license. One purchase covers all three.
Yes. The Solo license covers personal projects and any code you write under your own contracts. For team installs (one license, multiple devs) grab the Team license at checkout.
All purchases are final, so we want you to be sure first. Take your time with the docs and feature list before buying, and email support@phptinker.com with any questions — we're happy to help you decide.
Join the early list and be first to know when PHPTinker launches. Early joiners get a free 1-year license — no credit card needed.