# ddless > A desktop PHP debugging tool that replaces dd(), dump(), and Xdebug with a visual, deterministic debugger. ## Overview ddless is a standalone desktop application for debugging PHP applications. It intercepts HTTP requests, executes your PHP code with instrumentation, and pauses at breakpoints so you can inspect variables, the call stack, and step through execution line by line. Unlike Xdebug, ddless does not require PHP extensions, IDE plugins, or complex configuration. It works with any PHP project (7.4+) across Local, Docker, WSL, and SSH remote environments. Supported frameworks: Laravel, Symfony, CodeIgniter 4, Tempest, WordPress, CakePHP, Yii2, Drupal, and Generic PHP (vanilla PHP or any custom framework). - Website: https://ddless.com - Documentation: https://ddless.com/docs - Download: https://ddless.com/download - Discord: https://discord.gg/xPtXguDrmC - Contact: jeffleyd@gmail.com ## Pricing ddless uses a freemium model: ### Community (Free — forever) - Local debugging (bare metal PHP) - Docker and WSL support - Regular breakpoints - Dumppoints — evaluate expressions, display results, terminate (like dd()) - Variable inspection (read-only) - Step In / Step Over / Step Out / Continue - Method execution (test any class method directly) - Task Runner (execute PHP code with streaming output and step debugging) - Code navigation (Ctrl+Click go-to-definition) - Quick file search and content search - Multi-session debugging (debug multiple projects simultaneously) - Console output viewer - Debug Playground (Beta) — evaluate PHP code in the current debug context with a Monaco editor ### Pro ($8/month or $72/year) Everything in Community, plus: - SSH Remote Debugging — debug on remote servers via SSH - Conditional Breakpoints — pause only when a PHP expression is true - Logpoints — log messages without pausing execution - Watch Expressions — monitor PHP expressions evaluated at every breakpoint hit - Conditional Dumppoints — dumppoints that only fire when a condition is true - Export & Import Debug Snapshots — save/share debug configurations as .ddless files - AI Copilot — AI-powered debugging assistant with code search, file reading, and memory (knowledge base) - AI Copilot in Task Runner — AI code generation from natural language, reads project files, searches code - Priority Chat with the Creator - PHPStorm Plugin ## Downloads Available for: - Windows (.exe installer, .zip portable) - macOS (.dmg — arm64 for M1/M2/M3/M4, x64 for Intel) - Linux (.AppImage, .deb, .rpm) Download page: https://ddless.com/download ## Why ddless Exists Developers often fall back to dd(), var_dump(), and error_log() because Xdebug is fragile — it breaks when Docker restarts, requires IDE-specific configuration, and doesn't work reliably across environments. ddless provides a deterministic debugging experience that works every time, regardless of your setup. ## Installation Requirements ### Windows - Windows 10/11 (64-bit) - PHP 7.4 or higher (for Local mode) - Docker Desktop (for Docker mode) - WSL2 (for WSL + Docker mode) ### Linux - Ubuntu 20.04+, Debian 11+, Fedora 35+, or equivalent - PHP 7.4 or higher (for Local mode) - Docker Engine (for Docker mode) - GTK3 libraries (usually pre-installed) ### macOS - macOS 11 (Big Sur) or later - Apple Silicon (M1/M2/M3/M4) or Intel processor - PHP 7.4 or higher (for Local mode) - Docker Desktop (for Docker mode) ## Runtime Modes DDLess supports four runtime modes. Choose based on how your PHP project runs. ### 1. Local Mode Use this when PHP is installed directly on your computer. Setup: 1. Create a new project in DDLess — enter a name, port, and select the framework: - Laravel — for Laravel projects (uses the framework bootstrap automatically) - Symfony — for Symfony projects (boots the Symfony kernel automatically) - CodeIgniter — for CodeIgniter 4 projects (uses the CI4 bootstrap) - Tempest — for Tempest PHP projects (boots via Tempest container) - WordPress — for WordPress sites (automatic bootstrap via wp-load.php, all plugins and themes available) - CakePHP — for CakePHP 4/5 projects (automatic bootstrap, middleware pipeline, TableRegistry ORM) - Yii2 — for Yii 2 projects (automatic bootstrap, ActiveRecord ORM, service locator) - Drupal — for Drupal 9/10/11 projects (DrupalKernel bootstrap, Entity API, service container) - Generic PHP — for vanilla PHP or custom frameworks (optionally set an entry point like public/index.php) 2. Select your project folder (the one containing artisan for Laravel, bin/console for Symfony, spark for CodeIgniter, etc.) 3. Choose Runtime: Local 4. If PHP is not in your system PATH, specify the PHP executable path Common PHP Paths: - Windows (XAMPP): C:\xampp\php\php.exe - Windows (WAMP): C:\wamp64\bin\php\php8.x\php.exe - Windows (Laragon): C:\laragon\bin\php\php-8.x\php.exe - Windows (Standalone): C:\php\php.exe - Linux: /usr/bin/php (usually automatic) - macOS (Homebrew Apple Silicon): /opt/homebrew/bin/php - macOS (Homebrew Intel): /usr/local/bin/php - macOS (MAMP): /Applications/MAMP/bin/php/php8.x/bin/php When to use: XAMPP, WAMP, MAMP, Laragon, or Laravel Valet users. PHP installed via Homebrew (macOS) or apt/dnf (Linux). Simple local development without containers. ### 2. Docker Mode Use this when your PHP application runs inside a Docker container. Setup: 1. Create a new project in DDLess 2. Select your project folder on your computer (the folder mounted into Docker) 3. Choose Runtime: Docker 4. Enter your Container Name (find it with docker ps) 5. Enter the Container Path where your project is mounted (e.g., /var/www/html) Example docker-compose.yml: services: app: container_name: my-laravel-app volumes: - ./:/var/www/html Configure: Container Name: my-laravel-app, Container Path: /var/www/html When to use: Laravel Sail users. Docker Compose development environments. Any containerized PHP application. ### 3. WSL + Docker Mode (Windows Only) Use this when you develop on Windows but your project and Docker run inside WSL2. Setup: 1. Create a new project in DDLess 2. Select your project folder using the WSL path: - Via network: \\wsl$\Ubuntu\home\username\my-project - Via mapped drive: Z:\home\username\my-project 3. Choose Runtime: WSL + Docker 4. Select your WSL Distribution (e.g., Ubuntu) 5. Enter your Container Name 6. Enter the Container Path When to use: Windows developers using WSL2 for better Docker performance. Projects stored in the Linux filesystem for speed. Teams mixing Windows and Linux workflows. ### 4. SSH Remote Mode (PRO) Use this to debug PHP applications running on remote servers. Setup: 1. Create a new project in DDLess 2. Enter the remote project path (e.g., /var/www/my-app) 3. Choose Runtime: SSH 4. Configure your SSH connection: - Host: Server address (IP or hostname) - Port: SSH port (default: 22) - Username: Your SSH user - Authentication: Password or Private Key SSH Key Authentication (Recommended): Windows (PowerShell): ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\ddless_key Linux/macOS (Terminal): ssh-keygen -t ed25519 -f ~/.ssh/ddless_key Then add the public key to your server's ~/.ssh/authorized_keys. When to use: Debugging staging or production servers. Remote development environments. Cloud-hosted applications (AWS, DigitalOcean, etc.). ## Debugging Your Application DDLess intercepts HTTP requests, executes your PHP code with instrumentation, and pauses at your breakpoints so you can inspect variables, the call stack, and step through execution line by line. There are three ways to debug with DDLess: Direct Request (simple, no browser needed), Proxy Mode (browser debugging with real sessions/cookies), and CLI Debug (debug terminal scripts like artisan commands and PHPUnit). ### Managing Projects Each project card on the home screen shows: - Framework badge: "Laravel" (red), "Symfony" (sky blue), "CodeIgniter" (orange), "Tempest" (violet), "WordPress" (blue), "CakePHP" (rose), "Yii2" (cyan), "Drupal" (light blue), or "Generic PHP" (gray) - Entry point: For Generic PHP projects, hover the info icon on the badge to see the configured entry point - PHP version: Displayed below the badge when detected - Status indicator: Green dot when listening, gray when idle Editing a project: Click the three-dot menu on the project card and select "Edit Project" to change the project name, port, framework, or entry point after creation. ### Direct Request (Postman, curl, Insomnia) The simplest approach — point any HTTP client directly at the DDLess port. Step 1: Start the Listener On the home screen, click the "Listen" button on your project card. The status changes to Listening and DDLess opens the debugger automatically. Step 2: Set Breakpoints - In the debugger, open a PHP file from the file explorer on the left - Click on a line number to add a breakpoint (a red dot appears) - Click the red dot again to remove it Step 3: Send a Request Point your HTTP client to the DDLess listener port (the port you configured for the project): curl http://127.0.0.1:YOUR_PORT/api/users DDLess receives the request, executes the PHP code with your breakpoints, and pauses when a breakpoint is hit. Step 4: Debug When execution hits your breakpoint: - The code editor highlights the current line - The Variables tab shows all values in the current scope - Use the debug controls (Continue, Next, Step In, Step Out) to navigate Best for: Testing specific API endpoints, backend routes, or when you don't need a full browser session. ### Proxy Mode (Browser) Proxy Mode starts a PHP built-in web server (`php -S`) that instruments your code for debugging while preserving real browser sessions, cookies, and authentication. Unlike Direct Request mode, you browse your application in a real browser with the full debugging experience. This is ideal when you need to debug with real authentication, sessions, CSRF tokens, or any workflow that requires a browser. How it works: Browser | v php -S (:PORT) — DDLess Debug Server | +-- Instruments PHP code +-- Breakpoints, step debugging, variable inspection +-- Sessions, cookies, auth work naturally Proxy Mode works with all runtime types: Local, WSL, Docker, WSL+Docker, and SSH. Setup: Step 1: Start the Listener On the home screen, click the "Listen" button on your project card. The status changes to Listening and DDLess opens the debugger. Step 2: Start the Debug Server Once the listener is running, a thin "Debug Server" bar appears above the main toolbar with the current status (Idle, Starting…, or Running) and two buttons. Click "Start Server" to boot `php -S` in your project's environment. - For Local, WSL, and SSH projects: a random port is assigned automatically. - For Docker and WSL+Docker projects: a fixed port is required (since it must be mapped in docker-compose.yml). A dialog will ask you to enter the port on the first start. Add the port mapping to your docker-compose.yml: ports: - "PORT:PORT" The port is saved per-project for reuse, and can be changed later in the "Open Browser" dialog — the debug server restarts on the new port before the browser opens. When the server starts, the status switches to "Running on :PORT" (e.g., :8234). Tip: If you don't need the bar (API-only projects), click the X on the right to hide it (only available when the server is stopped). The preference is saved per project. To bring it back, click the small antenna icon that appears next to "Task Runner" in the toolbar. Step 3: Open Browser Click "Open Browser" (next to Start Server). The button is enabled once the server is running. A dialog asks for the domain: - For local projects: defaults to "localhost" - For SSH projects: enter the production domain (e.g., myapp.example.com) DDLess launches Chrome with a persistent profile per project. Logins, cookies and bookmarks survive between debug sessions; only the HSTS cache is wiped on each launch (so a domain you have visited in production with HTTPS doesn't force-upgrade your local http://). For SSH projects, Chrome is configured with --host-resolver-rules to map the domain to localhost, so cookies and sessions work as if you were on the real domain. Step 4: Set Breakpoints and Browse Set your breakpoints in the debugger, then navigate your application in the browser. When a request hits a breakpoint, DDLess pauses execution and shows the debug state. Use Continue, Next, Step In, Step Out as usual. When you're done, just click "Back" in the top-left of the debugger — it stops the listener for you and returns to the project list. How it works per runtime: - Local: DDLess spawns `php -S 0.0.0.0:PORT` directly with your project's PHP binary. - WSL: DDLess runs `wsl.exe -d DISTRO env VARS php -S 0.0.0.0:PORT` through the WSL distribution. - Docker: DDLess runs `docker exec -e VARS CONTAINER php -S 0.0.0.0:PORT` inside the container. - WSL+Docker (Laravel Sail): DDLess runs `wsl.exe -d DISTRO -- docker exec -e VARS CONTAINER php -S 0.0.0.0:PORT` combining both layers. - SSH: DDLess starts `php -S 127.0.0.1:PORT` on the remote server via SSH and creates an SSH tunnel (local port → remote port) so the browser connects to localhost. Important: `php -S` is single-threaded. If your code makes an HTTP request back to itself during the same request (e.g., sync queue jobs calling webhooks on the same app), it will deadlock. Use a queue driver like `database` or `redis` instead of `sync` to avoid this. Example: Laravel Sail with Docker Laravel Sail runs in a Docker container. To debug it with DDLess: 1. Add a port mapping in docker-compose.yml: ports: ["6375:6375"] 2. Click "Listen" on the project card 3. In the Debug Server bar, click "Start Server" — enter port 6375 when prompted 4. Click "Open Browser" — enter "localhost" as domain 5. Browse http://localhost:6375 in the launched Chrome — DDLess instruments and debugs your code ### CLI Debug (Terminal) Debug PHP scripts that run from the terminal — artisan commands, PHPUnit tests, queue workers, migrations, seeders, or any standalone PHP file — with the same breakpoint experience as HTTP requests. Prerequisites: - The project must be in Listening mode (click "Listen" on the project card first) - The .ddless/php-ddless wrapper is automatically created when DDLess scaffolds your project Usage: .ddless/php-ddless [--host=]