Features Use cases Docs Download Changelog Blog FAQ Join Early Access
Coming soon · macOS, Windows & Linux

The native PHP REPL that boots your whole app.

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.

Early preview Universal binary Bring your own PHP
Early joiners get a free 1-year license when we launch
scratch · acme-shop migrations payouts
Laravel 11 · php 8.3
// 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()
Output · streamed
Illuminate\Support\Collection {
  "darwin" => 24,
  "win32"  => 11,
  "linux"  => 4,
  "never"  => 9,
}
8.2 ms 3 queries 1,284 classes indexed
⌘ ⏎
Works with any PHP project
Laravel Filament Statamic Symfony WordPress Lumen

A scratchpad that respects your codebase.

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.

12 ms
Median Laravel boot, vs. ~1.4 s for artisan tinker
3
Modes — raw PHP, composer-only, full Laravel kernel
Concurrent tabs, each with its own project & PHP process
0
Bytes of telemetry. Your code never leaves your machine.
The difference

PHPTinker vs. php artisan tinker

Same 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
Features

Built for the way PHP devs actually work.

Everything you need to debug, prototype, and explore — without leaving your editor mindset.

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.

Project-aware tabs

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.

Real Laravel boot

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.

FQCN-aware autocomplete

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.

Auto-dump expressions

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.

Streaming output

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.

Pretty dumps for real types

Custom printers for Illuminate\Support\Collection, Eloquent models, DateTimeInterface, and Stringable. No more wading through a recursive var_dump of a hydrated relation.

Readable exception traces

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.

Background class indexing

The class scanner runs silently the first time, then re-runs only when composer install changes anything. Cached for 24h, on disk, per project.

Three execution modes

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.

Bring your own PHP

PHPTinker spawns the php binary you point it at — Homebrew, Herd, Valet, php-fpm wrappers. No bundled runtime, no version mismatch, no surprises.

State persists locally

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.

Local-only by design

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.

Why PHPTinker

Hours saved weekly. Mistakes caught earlier.

The real win isn't a faster boot — it's the rituals you stop performing because they're no longer necessary.

No more disposable controllers

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.

Confidence before you commit

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.

The shortest path from idea to answer

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.

Your project's PHP, not ours

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.

Use cases

If you've ever said "let me just check"…

You already know what PHPTinker is for. Here's where it earns its keep.

Eloquent

Inspect a query before shipping

Hydrate a model, dump the relationships, count the queries. Catch N+1s and missing indexes before code review does.

Data fixes

One-off corrections, safely

Run that UPDATE as PHP, with an each() and a dry-run wrapper, instead of typing it directly into psql. Reversible, observable, dumpable.

Packages

Spike a third-party library

Pull a class from vendor/, instantiate it, see what its public surface actually looks like — without grepping README files.

Debugging

Reproduce a bug locally

Paste the production payload, run the controller's logic line by line, watch state mutate. Faster than spinning up a failing test.

Learning

Teach Laravel by doing

An ideal classroom tool — students write code against a real app, see real output, without learning artisan, routing, or HTTP first.

Architecture

Prototype before you abstract

Try the service. Try the action. Try the value object. See which shape feels right against real data before you commit to a class.

Early reactions

What early testers are saying.

PHPTinker is in private beta. Here's what the first developers using it day to day have told us.

Pricing

Simple, honest pricing.

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.

  • All desktop platforms included
  • License key delivered instantly
  • Works fully offline after activation
Early Access — Limited spots

Be first. Get a free year on us.

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.

Free 1-year license Priority access Launch-day notification Influence the roadmap
FAQ

Frequently asked questions.

Still curious? Email us — a real person reads every message.

Which PHP versions does it support?

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.

Does it require Laravel?

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.

What about Lumen, Symfony, or custom apps?

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.

Does PHPTinker phone home?

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.

How does the AI assist work — and is it private?

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.

How is this different from php artisan tinker?

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.

Mac, Windows, Linux?

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.

Can I use it for client work?

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.

Can I try before I buy?

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.

Stop scaffolding. Start tinkering.

Join the early list and be first to know when PHPTinker launches. Early joiners get a free 1-year license — no credit card needed.