Building modern web apps shouldn't require learning 50 new concepts. Sometimes you just want to write PHP. Building modern web apps shouldn't require learning 50 new concepts. Sometimes you just want to write PHP. The Problem with Modern PHP Frameworks Don't get me wrong—Laravel, Symfony, and other frameworks are incredible. But sometimes you're building a simple web app and you find yourself: 📚 Reading documentation for hours just to create a basic form 🔧 Configuring dozens of services you don't need 🐘 Fighting with complex abstractions for simple tasks ⚡ Waiting for slow development servers to restart 📚 Reading documentation for hours just to create a basic form 🔧 Configuring dozens of services you don't need 🐘 Fighting with complex abstractions for simple tasks ⚡ Waiting for slow development servers to restart What if there was a better way? Meet Lighthouse 🚨 Lighthouse is a minimal, predictable PHP micro-framework that embraces the simplicity PHP was meant for. It's designed around one core principle: get productive immediately. minimal, predictable PHP micro-framework get productive immediately <?php // That's it. Your first route. route('/', function() { return view('home.php', ['message' => 'Hello World!']); }); <?php // That's it. Your first route. route('/', function() { return view('home.php', ['message' => 'Hello World!']); }); Why Lighthouse is Different 1. Logic Where It Makes Sense Logic Where It Makes Sense Instead of forcing everything through controllers, Lighthouse lets you handle form logic directly in views—the way PHP was designed: <?php // views/contact.php $errors = []; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $email = sanitize_email($_POST['email']); $message = sanitize_string($_POST['message']); if (!validate_email($email)) { $errors[] = 'Invalid email'; } if (empty($errors)) { db_insert('contacts', ['email' => $email, 'message' => $message]); $success = 'Message sent!'; } } ?> <form method="POST"> <?php if ($success ?? false): ?> <div class="success"><?= $success ?></div> <?php endif; ?> <input type="email" name="email" required> <textarea name="message" required></textarea> <button type="submit">Send</button> </form> <?php // views/contact.php $errors = []; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $email = sanitize_email($_POST['email']); $message = sanitize_string($_POST['message']); if (!validate_email($email)) { $errors[] = 'Invalid email'; } if (empty($errors)) { db_insert('contacts', ['email' => $email, 'message' => $message]); $success = 'Message sent!'; } } ?> <form method="POST"> <?php if ($success ?? false): ?> <div class="success"><?= $success ?></div> <?php endif; ?> <input type="email" name="email" required> <textarea name="message" required></textarea> <button type="submit">Send</button> </form> Self-contained. Predictable. No magic. Self-contained. Predictable. No magic. 2. Modern Stack, Zero Configuration Modern Stack, Zero Configuration PHP 8+ with type hints and modern features SQLite for zero-config databases HTMX for dynamic interactions Pico.css for beautiful, minimal styling PHP 8+ with type hints and modern features PHP 8+ SQLite for zero-config databases SQLite HTMX for dynamic interactions HTMX Pico.css for beautiful, minimal styling Pico.css # Get started in 30 seconds lighthouse new my-app cd my-app php -S localhost:8000 -t public/ # Get started in 30 seconds lighthouse new my-app cd my-app php -S localhost:8000 -t public/ 3. Security by Default Security by Default // CSRF protection built-in <?= csrf_field() ?> // Input sanitization included $clean_input = sanitize_string($_POST['data']); // Rate limiting ready if (!check_rate_limit($_SERVER['REMOTE_ADDR'])) { // Handle rate limit } // CSRF protection built-in <?= csrf_field() ?> // Input sanitization included $clean_input = sanitize_string($_POST['data']); // Rate limiting ready if (!check_rate_limit($_SERVER['REMOTE_ADDR'])) { // Handle rate limit } 4. Database Operations That Make Sense Database Operations That Make Sense // Simple, predictable database operations $users = db_select('users', ['active' => 1]); $user_id = db_insert('users', ['name' => $name, 'email' => $email]); db_update('users', ['last_login' => date('Y-m-d H:i:s')], ['id' => $user_id]); // Simple, predictable database operations $users = db_select('users', ['active' => 1]); $user_id = db_insert('users', ['name' => $name, 'email' => $email]); db_update('users', ['last_login' => date('Y-m-d H:i:s')], ['id' => $user_id]); Real-World Example: Authentication in 5 Minutes Here's how you build a complete login system: <?php // routes.php route('/login', function() { return view('login.php'); }); route('/dashboard', function() { if (!auth_user()) { header('Location: /login'); exit; } return view('dashboard.php'); }); <?php // routes.php route('/login', function() { return view('login.php'); }); route('/dashboard', function() { if (!auth_user()) { header('Location: /login'); exit; } return view('dashboard.php'); }); <?php // views/login.php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $email = sanitize_email($_POST['email']); $password = $_POST['password']; $user = db_select_one('users', ['email' => $email]); if ($user && auth_verify_password($password, $user['password'])) { auth_login($user['id']); header('Location: /dashboard'); exit; } $error = 'Invalid credentials'; } ?> <form method="POST"> <?php if ($error ?? false): ?> <div class="error"><?= $error ?></div> <?php endif; ?> <input type="email" name="email" required> <input type="password" name="password" required> <?= csrf_field() ?> <button type="submit">Login</button> </form> <?php // views/login.php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $email = sanitize_email($_POST['email']); $password = $_POST['password']; $user = db_select_one('users', ['email' => $email]); if ($user && auth_verify_password($password, $user['password'])) { auth_login($user['id']); header('Location: /dashboard'); exit; } $error = 'Invalid credentials'; } ?> <form method="POST"> <?php if ($error ?? false): ?> <div class="error"><?= $error ?></div> <?php endif; ?> <input type="email" name="email" required> <input type="password" name="password" required> <?= csrf_field() ?> <button type="submit">Login</button> </form> That's it. No controllers, no middleware configuration, no service providers. Just PHP doing what PHP does best. That's it. When to Use Lighthouse Lighthouse shines when you're building: 🚀 MVPs and prototypes - Get to market fast 📊 Internal tools and dashboards - No need for complexity 🏢 Small business websites - Contact forms, simple e-commerce 🎓 Learning projects - Focus on concepts, not framework magic 🔧 API backends - Lightweight and fast 🚀 MVPs and prototypes - Get to market fast MVPs and prototypes 📊 Internal tools and dashboards - No need for complexity Internal tools and dashboards 🏢 Small business websites - Contact forms, simple e-commerce Small business websites 🎓 Learning projects - Focus on concepts, not framework magic Learning projects 🔧 API backends - Lightweight and fast API backends The Philosophy Lighthouse embraces pragmatic PHP development: pragmatic PHP development Start simple - Use logic in views for rapid development Refactor when needed - Move to more complex patterns as you grow Choose what fits - Multiple approaches supported Stay productive - Don't over-engineer simple problems Start simple - Use logic in views for rapid development Start simple Refactor when needed - Move to more complex patterns as you grow Refactor when needed Choose what fits - Multiple approaches supported Choose what fits Stay productive - Don't over-engineer simple problems Stay productive Getting Started # Install the CLI bash -c "$(curl -fsSL https://raw.githubusercontent.com/max-yterb/Lighthouse/main/scripts/install.sh)" # Create your first app lighthouse new my-awesome-app cd my-awesome-app # Start building php -S localhost:8000 -t public/ # Install the CLI bash -c "$(curl -fsSL https://raw.githubusercontent.com/max-yterb/Lighthouse/main/scripts/install.sh)" # Create your first app lighthouse new my-awesome-app cd my-awesome-app # Start building php -S localhost:8000 -t public/ What's Next? Lighthouse is actively developed with a focus on: 🔐 Enhanced authentication providers (OAuth, SAML) 🗄️ Multiple database support (MySQL, PostgreSQL) ⚡ Performance monitoring tools 📱 Advanced HTMX integration patterns 🔐 Enhanced authentication providers (OAuth, SAML) 🗄️ Multiple database support (MySQL, PostgreSQL) ⚡ Performance monitoring tools 📱 Advanced HTMX integration patterns Try It Today If you're tired of complex frameworks for simple projects, give Lighthouse a try. It might just remind you why you fell in love with PHP in the first place. 📖 Documentation: max-yterb.github.io/Lighthouse 💻 GitHub: github.com/max-yterb/Lighthouse 💬 Discussions: GitHub Discussions 📖 Documentation: max-yterb.github.io/Lighthouse Documentation max-yterb.github.io/Lighthouse 💻 GitHub: github.com/max-yterb/Lighthouse GitHub github.com/max-yterb/Lighthouse 💬 Discussions: GitHub Discussions Discussions GitHub Discussions What do you think? Are you ready to try a framework that gets out of your way? Drop a comment below with your thoughts on modern PHP development! What do you think? Are you ready to try a framework that gets out of your way? Drop a comment below with your thoughts on modern PHP development!