Keyword search can miss records that describe the same problem using different words. In this tutorial, we will add semantic search to a PHPRunner support-ticket application. A search for ‘customers having access or login problems’ can find tickets about rejected credentials, unauthorized sessions, or account access even when they do not contain the exact search phrase.

The application uses the OpenAI Embeddings API to convert ticket text and each search phrase into vectors. PHPRunner then compares those vectors locally with cosine similarity and returns the 30 closest tickets. This approach is intended for relatively small collections. For tens of thousands of records or more, use a vector database instead of comparing every vector in PHP. The cosine similarity scores in the diagram measure how closely the vectors are related. They are not probabilities or percentages of correctness.

Continue Reading "Add Semantic Search to a PHPRunner Application" →

Employees often need to complete onboarding, safety, or compliance videos. In this tutorial, we will build a training video tracker that resumes each video from the saved position, allows rewinding, prevents users from skipping unwatched sections, and records completion.

The same approach works in PHPRunner and ASPRunner.NET. The browser-side code is the same in both products, while the server-side examples are provided separately in PHP and C#.

Continue Reading "Track Employee Training Video Completion" →

Equipment checkout applications need to do more than store a list of assets. The application should prevent duplicate checkouts, show only actions that match the current asset status, record returns, flag overdue equipment, and let staff find an item quickly.

In this tutorial, we will build that workflow in PHPRunner or ASPRunner.NET and add camera-based QR code scanning. The JavaScript is the same in both products. Server events are provided in PHP and C#.

Continue Reading "Build an Equipment Checkout System with QR Code Scanning" →

Exporting hundreds of thousands of records during a normal page request can exceed PHP execution limits and leave the user waiting without any indication of progress.

This PHPRunner tutorial moves large CSV exports into a scheduled worker. Users submit an export request, the worker processes a fixed number of records per run, and the List page shows progress until the ZIP file is ready to download.

Continue Reading "Process Large CSV Exports in Background Batches" →

The Model Context Protocol, or MCP, provides a standard way for AI assistants to connect to applications, discover available tools, and work with live data.

We created an early MCP prototype to explore how this technology could work inside a generated PHPRunner application.

Watch the PHPRunner MCP demonstration on YouTube

Download the PHPRunner MCP sample project

Continue Reading "Experimenting with MCP Support in PHPRunner" →

List pages often contain several actions for every record. Displaying each action as a separate button can make the grid unnecessarily wide, especially on smaller screens.

In this tutorial, we will add one menu button to each grid row. The menu will open View, Edit, Copy, and related-record pages, process Delete with confirmation, and include an Archive placeholder for project-specific code. The same approach works in PHPRunner and ASPRunner.NET.

Custom row actions menu on a data grid

Continue Reading "Add a Custom Row Actions Menu to a Data Grid" →

PHPRunner and ASPRunner.NET dashboards can display several grids on one page. In this tutorial, we will add a separate search box to each grid so users can filter Customers, Products, or Employees without affecting the other dashboard elements.

The solution uses one reusable JavaScript function and a small amount of Custom CSS. The same code works in PHPRunner and ASPRunner.NET.

Continue Reading "Add Search Boxes to Individual Dashboard Grids" →

PHPRunner and ASPRunner.NET already provide password policies, encrypted password storage, CAPTCHA, two-factor authentication, and user permissions. In this tutorial, we will add two more checks: reject passwords found in known data breaches and block visitors whose IP addresses have a very high abuse score.

During registration, haveibeenpwned.com checks whether the password has appeared in known data breaches. The password itself is never sent to the service, and this API does not require a key.

Before processing an application page, abuseipdb.com checks whether the visitor’s IP address has been associated with abusive activity. This service requires an API key. Section 6 explains how to create that key. The results are cached locally to reduce the number of external requests.

Continue Reading "Block Compromised Passwords and High-Risk IP Addresses" →

PHPRunner’s Security API lets an administrator switch to another application user without knowing that user’s password. This is useful when an administrator needs to reproduce a problem using the same pages, permissions, and data access as the user.

In this tutorial we will add an impersonation button to the login table, switch accounts with Security::loginAs(), display a warning banner while impersonation is active, and provide a link that restores the original administrator session.

We will cover:

1. Preparing the login table and administrator group
2. Adding an impersonation button to the List page
3. Showing the button only to administrators
4. Switching to the selected user
5. Redirecting after impersonation
6. Adding an impersonation banner
7. Styling the banner
8. Returning to the administrator session

Continue Reading "How to Add User Impersonation to a PHPRunner Application" →

Version 11.3 build 44452 introduces new visual theme: Harbor.

Harbor is a new PHPRunner/ASPRunner.NET theme created for modern, data-driven applications. It combines deep navy navigation, clean white surfaces, subtle borders, and a restrained blue accent. We paid special attention to the areas people use every day: grids are easier to scan, forms have more breathing room, dashboards share a consistent card style, and common actions are easier to recognize. Small touches—like removing vertical grid lines, standardizing panel headings, and adding icons to key buttons help Harbor feel cleaner and more focused while keeping the familiar workflow.

Continue Reading "Introducing Harbor: A Fresh New Theme for PHPRunner/ASPRunner.NET" →