<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Expression Lab Blog</title>
        <link>https://expressionlab.io/blog</link>
        <description>Expression Lab Blog</description>
        <lastBuildDate>Mon, 05 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[An Overview of Expression Lab]]></title>
            <link>https://expressionlab.io/blog/an-overview-of-expression-lab</link>
            <guid>https://expressionlab.io/blog/an-overview-of-expression-lab</guid>
            <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[I'm Anderson Salas, creator of Expression Lab. In this post, I want to take a closer look at the project: its origins, development challenges, philosophy, use cases, and future vision.]]></description>
            <content:encoded><![CDATA[<p>I'm Anderson Salas, creator of Expression Lab. In this post, I want to take a closer look at the project: its origins, the challenges faced during development, its philosophy, its use cases, and its future vision.</p>
<p>New around here? Don't worry. This isn't a tutorial, nor is it dry technical documentation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Gd2v" id="the-origins-trenches-of-tier-2-support">The origins: trenches of Tier 2 support<a href="https://expressionlab.io/blog/an-overview-of-expression-lab#the-origins-trenches-of-tier-2-support" class="hash-link" aria-label="Direct link to The origins: trenches of Tier 2 support" title="Direct link to The origins: trenches of Tier 2 support" translate="no">​</a></h3>
<p>One of the wonderful things about WordPress is the endless variety of things you can build with it: there are plugins and themes for virtually anything you can imagine.</p>
<p>I worked as a Tier 2 support engineer for nearly five years. During that time, I handled user-reported issues daily—some trivial, others far from it. This quickly led me to ask, if every WordPress site is <em>unique</em>, how do you troubleshoot an issue that could literally come from anywhere?</p>
<p>If you've been (or currently are) a support engineer like me, these practices will sound very familiar:</p>
<ol>
<li class="">Uploading an MU plugin containing a <code>var_dump</code> or an <code>error_log</code>.</li>
<li class="">Installing the <a href="https://querymonitor.com/" target="_blank" rel="noopener noreferrer" class="">Query Monitor</a> plugin or opening a <a href="https://wordpress.org/cli/" target="_blank" rel="noopener noreferrer" class="">WP-CLI</a> session—absolute industry standards and personal favorites of many, myself included.</li>
<li class="">In certain cases, upload an <a href="https://www.adminer.org/" target="_blank" rel="noopener noreferrer" class="">Adminer</a> script to inspect or dump the database directly (with the user's permission).</li>
</ol>
<p>All of these are legitimate strategies when used responsibly. However, each tackles the problem from a different angle, almost always demanding an exhausting, multidisciplinary balancing act from the support engineer. It was precisely within that friction where the core idea behind Expression Lab emerged: <em>What if there was an alternative that could complement all of the above?</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Gd2v" id="the-challenge-finding-a-safe-alternative-to-eval">The challenge: finding a safe alternative to eval()<a href="https://expressionlab.io/blog/an-overview-of-expression-lab#the-challenge-finding-a-safe-alternative-to-eval" class="hash-link" aria-label="Direct link to The challenge: finding a safe alternative to eval()" title="Direct link to The challenge: finding a safe alternative to eval()" translate="no">​</a></h3>
<p>When we envision an interactive diagnostics environment, our thoughts inevitably gravitate toward running arbitrary PHP code on the server.</p>
<p>PHP already has a built-in construct for this: the controversial and dreaded <code>eval()</code>. However, <a href="https://www.php.net/manual/en/function.eval.php" target="_blank" rel="noopener noreferrer" class="">its own documentation</a> explicitly warns about its severe security implications:</p>
<blockquote>
<p><strong>Caution</strong>: The <strong>eval()</strong> language construct is <em>very dangerous</em> because it allows execution of arbitrary PHP code. <em>Its use thus is discouraged</em>. If you have carefully verified that there is no other option than to use this construct, pay special attention <em>not to pass any user provided data</em> into it without properly validating it beforehand.</p>
</blockquote>
<p>Therefore, doing something like this was <em>completely</em> out of the question:</p>
<div class="language-php codeBlockContainer_hjCj theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KhLb"><pre tabindex="0" class="prism-code language-php codeBlock_q0Ma thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ADtB"><div class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">$result</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">eval</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$_POST</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#e3116c">'code'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>After extensive research, the answer arrived from an unexpected place: Symfony's <a href="https://symfony.com/doc/current/expression_language.html" target="_blank" rel="noopener noreferrer" class="">Expression Language</a> component.</p>
<p>As its name suggests, this component evaluates expressions that return a value. It is primarily used as a lightweight engine for embedding dynamic logic into configuration files:</p>
<div class="language-js codeBlockContainer_hjCj theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KhLb"><pre tabindex="0" class="prism-code language-js codeBlock_q0Ma thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ADtB"><div class="token-line" style="color:#393A34"><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getGroup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'good_customers'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'collaborator'</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<div class="language-js codeBlockContainer_hjCj theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KhLb"><pre tabindex="0" class="prism-code language-js codeBlock_q0Ma thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_ADtB"><div class="token-line" style="color:#393A34"><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">commentCount</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> and article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">category</span><span class="token plain"> not </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"misc"</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p>Naturally, evaluating static rules in YAML is very different from exploring a relational CMS. The challenge was evolving that lightweight evaluator into a full DSL with fluent entities, sandboxed execution limits, and in-memory SQLite mirroring—all while ensuring no raw PHP or private keys ever touch the WordPress database. Subsequent development focused on writing a standard library of services to observe the internal state of a live WordPress instance deterministically, and crafting an intuitive, ergonomic UI capable of managing multiple independent execution workflows.</p>
<h3 class="anchor anchorTargetStickyNavbar_Gd2v" id="the-philosophy-safe-diagnostics-should-be-accessible-not-an-afterthought">The philosophy: safe diagnostics should be accessible, not an afterthought<a href="https://expressionlab.io/blog/an-overview-of-expression-lab#the-philosophy-safe-diagnostics-should-be-accessible-not-an-afterthought" class="hash-link" aria-label="Direct link to The philosophy: safe diagnostics should be accessible, not an afterthought" title="Direct link to The philosophy: safe diagnostics should be accessible, not an afterthought" translate="no">​</a></h3>
<p>Expression Lab is distributed under the GPLv2 license. This is far more than a legal formality; it is a personal conviction:</p>
<ol>
<li class=""><strong>Diagnosing an issue shouldn't require risking site stability:</strong> Everyone deserves access to safe, non-destructive tools to understand runtime state without dreading a fatal error.</li>
<li class=""><strong>Diagnostics and development go hand in hand:</strong> Expression Lab is not just a tool for support teams—it provides high-fidelity telemetry for developers. Both roles can contribute ideas or code to a tool built for the community's benefit.</li>
</ol>
<p>I firmly believe in the power of great tooling to improve people's workflows and elevate an entire ecosystem.</p>
<h3 class="anchor anchorTargetStickyNavbar_Gd2v" id="use-cases-where-does-expression-lab-shine">Use cases: Where does Expression Lab shine?<a href="https://expressionlab.io/blog/an-overview-of-expression-lab#use-cases-where-does-expression-lab-shine" class="hash-link" aria-label="Direct link to Use cases: Where does Expression Lab shine?" title="Direct link to Use cases: Where does Expression Lab shine?" translate="no">​</a></h3>
<p>Today, Expression Lab is tailored specifically for <strong>local development and staging environments</strong>:</p>
<ul>
<li class=""><strong>Debugging complex queries, transients, or scheduled cron events</strong> without littering your codebase with temporary <code>var_dump()</code> calls or leaving cleanup behind.</li>
<li class=""><strong>Exploratory analysis and ad-hoc aggregations</strong> through in-memory SQLite, allowing you to slice and inspect data safely without mutating test database tables.</li>
<li class=""><strong>Auditing internal WordPress state</strong> in real time during plugin development, giving you immediate feedback through an interactive, visual console.</li>
</ul>
<p>That said, allow me to be completely candid: <strong>Expression Lab is an experimental prototype in an alpha stage.</strong></p>
<p>Even though the core was architected around strict security premises, <strong>it has not undergone independent, external security audits</strong>.</p>
<p>For this reason, <strong>it must not be installed under any circumstances on production websites</strong>, nor in environments subject to compliance frameworks (SOC 2, PCI-DSS, HIPAA), critical infrastructure, government systems, military environments, or any application processing credit card data or personally identifiable information (PII).</p>
<h3 class="anchor anchorTargetStickyNavbar_Gd2v" id="the-road-ahead">The road ahead<a href="https://expressionlab.io/blog/an-overview-of-expression-lab#the-road-ahead" class="hash-link" aria-label="Direct link to The road ahead" title="Direct link to The road ahead" translate="no">​</a></h3>
<p>Expression Lab doesn't aim to replace established tools; it seeks to offer a complementary plane: a visual, declarative, and deterministic console for understanding how WordPress works from the inside out.</p>
<p>The project is completely open source, and during this alpha phase, what it needs most is critical eyes, testing in local labs, and technical feedback:</p>
<ul>
<li class=""><strong>GitHub Repository:</strong> <a href="https://github.com/andersonsalas/expressionlab" target="_blank" rel="noopener noreferrer" class="">andersonsalas/expressionlab</a></li>
<li class=""><strong>Official Documentation:</strong> <a href="https://expressionlab.io/" target="_blank" rel="noopener noreferrer" class="">expressionlab.io</a></li>
</ul>
<p>If you're passionate about WordPress architecture, install it locally, take it for a spin, and let me know your thoughts in the repository issues and discussions.</p>
<div class="wrapper_ncE8"><a class="button button--primary button--lg installation-download-btn" href="https://github.com/andersonsalas/expressionlab/releases/download/v0.2.0-alpha/expressionlab-0.2.0-alpha.zip" target="_blank" rel="noopener noreferrer" aria-label="Download Expression Lab v0.2.0-alpha (ZIP)">Download Expression Lab</a><div class="version_ZP68">Current version: v0.2.0-alpha</div></div>]]></content:encoded>
            <category>writings</category>
        </item>
    </channel>
</rss>