<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://andwaller.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://andwaller.github.io/" rel="alternate" type="text/html" /><updated>2026-06-27T13:23:11+00:00</updated><id>https://andwaller.github.io/feed.xml</id><title type="html">Ari Waller</title><subtitle>Writing about developer relations, community, and building with AI.</subtitle><author><name>Ari Waller</name></author><entry><title type="html">The Skill in Action: From CSV to Star Wars Graph with Claude Code and Zed</title><link href="https://andwaller.github.io/2026/06/26/star-wars-lego-walkthrough.html" rel="alternate" type="text/html" title="The Skill in Action: From CSV to Star Wars Graph with Claude Code and Zed" /><published>2026-06-26T00:00:00+00:00</published><updated>2026-06-26T00:00:00+00:00</updated><id>https://andwaller.github.io/2026/06/26/star-wars-lego-walkthrough</id><content type="html" xml:base="https://andwaller.github.io/2026/06/26/star-wars-lego-walkthrough.html"><![CDATA[<style>
figure { margin: 2em 0; text-align: center; }
figure img { max-width: 100%; width: 100%; display: block; margin: 0 auto; border: 1px solid #ddd; border-radius: 4px; }
figcaption { margin-top: 0.6em; font-size: 0.85em; color: #666; font-style: italic; text-align: center; }
.instruction { display: flex; align-items: flex-start; gap: 14px; background: #f0f7ff; border-left: 4px solid #0369a1; padding: 13px 16px; margin: 1.4em 0; border-radius: 0 6px 6px 0; font-size: 1em; line-height: 1.5; }
.step-label { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; height: 26px; background: #0369a1; color: white; border-radius: 50%; font-size: 0.8em; font-weight: 700; flex-shrink: 0; margin-top: 2px; }
</style>

<p>If you read <a href="/2026/06/07/star-wars-lego-open-source-contribution.html">Part 1</a>, you know how this started: I wanted to build a Star Wars LEGO database, my AI agent kept hallucinating schema that didn’t exist, and fixing that problem turned into my first open source contribution to <code class="language-plaintext highlighter-rouge">neo4j-contrib/neo4j-skills</code>.</p>

<p>That post told the story. This one shows the work.</p>

<p>Here’s why it’s worth following along: if you’ve ever asked an AI agent to help you build a database and ended up with queries that run but return nothing – because the labels are wrong, the relationship types are invented, the properties don’t match – this is the workflow that solves that. The agent reads a schema file before writing a single line of Cypher. You define it once from your own data. Everything after is validated against it.</p>

<p>I’m not an engineer. I did this entirely in plain English, with Claude Code running alongside the project in Zed. No Cypher knowledge required – I still don’t have any.</p>

<p>Now let’s walk through it.</p>

<h2 id="what-the-contribution-actually-did--in-plain-english">What the contribution actually did – in plain English</h2>

<p>The Neo4j cypher skill already knew how to write Cypher. What it didn’t have was a way to work when there was no database to learn from.</p>

<p>The skill needs a live connection to read the schema – what nodes exist, what relationships exist, what properties they have. Without that, it guesses. And as I showed in Part 1, it guesses wrong. It wrote <code class="language-plaintext highlighter-rouge">:Minifigure</code> when the label was <code class="language-plaintext highlighter-rouge">:Minifig</code>. It wrote <code class="language-plaintext highlighter-rouge">:CONTAINS</code> when the relationship was <code class="language-plaintext highlighter-rouge">:HAS_MINIFIG</code>. Plausible. Incorrect. No way to know the difference without a schema.</p>

<p>What PR #32 added was simple: <strong>read the schema from a file first.</strong> Before the database exists. Before you’ve written a single import script. Before you know anything about Cypher yourself.</p>

<p>That one change means a complete beginner can now:</p>

<ul>
  <li>Describe their data in plain English and get a schema file written from their CSVs automatically</li>
  <li>Have every Cypher query validated against it – labels, relationships, properties, directions</li>
  <li>Import their data correctly the first time</li>
  <li>Query it in plain English without knowing the query language</li>
</ul>

<p>You don’t need to know what a node is. You don’t need to know what a relationship type looks like. You don’t need an existing database to copy from. The skill holds all of that knowledge. You just have to show up with your data.</p>

<h2 id="what-you-need">What you need</h2>

<p>Everything in this walkthrough is free. I know because I checked before I started – I wasn’t building something that required a subscription or a credit card to follow along.</p>

<p><strong>Zed</strong> – the code editor we’re using. Download at <a href="https://zed.dev">zed.dev</a>. Available on macOS, Windows, and Linux.</p>

<p><strong>Node.js / npm</strong> – required to run the <code class="language-plaintext highlighter-rouge">npx skills add</code> command. Download at <a href="https://nodejs.org">nodejs.org</a> (LTS version). Check with <code class="language-plaintext highlighter-rouge">node --version</code> in your terminal.</p>

<p><strong>Python</strong> – required to run the import scripts. Download at <a href="https://python.org">python.org</a> (version 3.8 or later). Check with <code class="language-plaintext highlighter-rouge">python --version</code> in your terminal.</p>

<p><strong>Claude Code</strong> – the AI agent that does the heavy lifting. Install instructions at <a href="https://claude.ai/code">claude.ai/code</a>. Requires a Claude Pro or API account.</p>

<p><strong>Neo4j Aura Free</strong> – your free cloud graph database. Sign up at <a href="https://console.neo4j.io">console.neo4j.io</a>. No credit card required.</p>

<p><strong>The Rebrickable CSVs</strong> – free to download at <a href="https://rebrickable.com/downloads">rebrickable.com/downloads</a>.</p>

<p>That’s the whole list. No local database, no server, no infrastructure to manage.</p>

<h2 id="step-1-install-the-skill">Step 1: Install the skill</h2>

<div class="instruction"><span class="step-label">a</span> Open Zed and hit <code>Ctrl+`</code> to open the built-in terminal.</div>

<div class="instruction"><span class="step-label">b</span> Run this command:</div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npx skills add neo4j-contrib/neo4j-skills/neo4j-cypher-skill
</code></pre></div></div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss01-install-command.png" alt="Zed terminal showing the npx skills add command with install prompt" />
<figcaption>Installing the neo4j-cypher-skill directly from Zed's built-in terminal -- no context switching required.</figcaption>
</figure>

<div class="instruction"><span class="step-label">c</span> The CLI asks which agent to install to. Select <strong>Zed</strong>.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss02-agent-selector.png" alt="The skills CLI agent selector showing all supported coding agents" />
<figcaption>The list includes Amp, Cline, Cursor, Codex, Gemini CLI, Zed, and others. Select Zed -- the skill will wire itself in automatically.</figcaption>
</figure>

<div class="instruction"><span class="step-label">d</span> When asked for installation scope, choose <strong>Project</strong>. The skill travels with your repository -- anyone who clones it gets the same agent behavior.</div>

<p>The CLI runs a security assessment before installing. When it completes, the skill is ready.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss04-install-complete.png" alt="Installation complete screen showing security assessment and file locations" />
<figcaption>Safe, 0 alerts, Low Risk. Files land in <code>~\.agents\skills\neo4j-cypher-skill</code> and Zed picks them up automatically.</figcaption>
</figure>

<h2 id="step-2-get-the-data">Step 2: Get the data</h2>

<p>The dataset comes from <a href="https://rebrickable.com/downloads/">Rebrickable</a> – a community-maintained LEGO database with every official set, minifigure, part, and color as freely downloadable CSVs. No account required, updated daily.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss05-rebrickable-downloads.png" alt="Rebrickable LEGO Catalog Database Downloads page showing schema diagram and file list" />
<figcaption>The schema diagram on the left shows exactly how the data is structured before you write a single line of Cypher.</figcaption>
</figure>

<p>That schema diagram is worth a moment. It shows the relational shape of the data: sets belong to themes, inventories link sets to their minifigs. This is exactly what we’re going to turn into a graph.</p>

<div class="instruction"><span class="step-label">a</span> Go to <a href="https://rebrickable.com/downloads">rebrickable.com/downloads</a> and download these five files -- click <strong>zip</strong> next to each:
<ul style="margin-top:8px;margin-bottom:0">
<li><code>themes.csv</code></li>
<li><code>sets.csv</code></li>
<li><code>minifigs.csv</code></li>
<li><code>inventories.csv</code></li>
<li><code>inventory_minifigs.csv</code></li>
</ul>
</div>

<div class="instruction"><span class="step-label">b</span> Create a folder called <code>lego-starwars-csvs</code>. Move the five zip files in. Select all with <strong>Ctrl+A</strong>, right-click, and choose <strong>Extract All</strong> into the same folder.</div>

<div class="instruction"><span class="step-label">c</span> Open the folder in Zed with <strong>Ctrl+K, Ctrl+O</strong> and select <code>lego-starwars-csvs</code>.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss09-zed-project-open.png" alt="Zed project sidebar showing five CSV files with database icons" />
<figcaption>Project open in Zed. Five CSVs in the sidebar -- Zed recognises them as structured data.</figcaption>
</figure>

<h2 id="step-3-define-the-schema--before-the-database-exists">Step 3: Define the schema – before the database exists</h2>

<p><strong>And to be clear about what’s happening here: there is no Neo4j database running.</strong> No Aura instance, no local server, no connection string. Just CSV files and the skill.</p>

<p>That’s the gap the PR fills. Without a schema file, the cypher skill infers the schema – which is where hallucinated labels and wrong relationship types come from. With a schema file, every query is validated before it runs.</p>

<div class="instruction"><span class="step-label">a</span> Open Zed's terminal with <code>Ctrl+`</code>, type <code>claude</code>, and hit Enter.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss11-claude-code-welcome.png" alt="Claude Code welcome screen showing version, model, and working directory" />
<figcaption>Claude Code v2.1.181, Sonnet 4.6, working directory lego-starwars-csvs. Ready.</figcaption>
</figure>

<div class="instruction"><span class="step-label">b</span> Type this prompt and hit Enter:</div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Use define_schema.py from the neo4j-cypher-skill to define a schema 
for a Star Wars LEGO graph database using the CSV files in this project. 
I want nodes for Theme, Set, and Minifig with relationships between them.
</code></pre></div></div>

<p>Claude Code reads the CSVs, builds the graph model, and asks permission to write <code class="language-plaintext highlighter-rouge">lego-starwars-schema.json</code>.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss13-schema-output-permission.png" alt="Claude Code showing schema output with relationships and permission prompt" />
<figcaption>Claude Code read the CSVs, built the graph model, and is asking permission to write the schema file.</figcaption>
</figure>

<div class="instruction"><span class="step-label">c</span> Hit <strong>Yes</strong> to approve writing the schema file.</div>

<p>It writes the file and explains what it modelled and why – including the key insight that <code class="language-plaintext highlighter-rouge">inventories</code> and <code class="language-plaintext highlighter-rouge">inventory_minifigs</code> are join tables that become the <code class="language-plaintext highlighter-rouge">INCLUDES_MINIFIG</code> relationship with quantity as its property, not separate nodes.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss14-schema-complete-graph-model.png" alt="Schema complete screen showing graph model table with nodes, properties, source CSV and join paths" />
<figcaption>The graph model table. Nodes, key properties, source CSV, and join paths. 123 lines written to import.cypher.</figcaption>
</figure>

<p><strong>No database. No connection string. No server running.</strong></p>

<p>The schema file now exists. Every Cypher query Claude Code generates from this point forward is validated against it – not guessed.</p>

<h2 id="step-4-the-empire-strikes-back--the-first-roadblock">Step 4: The Empire Strikes Back – the first roadblock</h2>

<p>Claude Code also wrote <code class="language-plaintext highlighter-rouge">import.cypher</code> alongside the schema. When you prompt it to run that against a live instance, it stops before executing a single line.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss16-file-path-issue.png" alt="Claude Code catching the file path issue before running anything" />
<figcaption>"file:/// paths in LOAD CSV don't work on AuraDB." Caught before running anything.</figcaption>
</figure>

<p><code class="language-plaintext highlighter-rouge">LOAD CSV</code> with <code class="language-plaintext highlighter-rouge">file:///</code> paths works against a local Neo4j instance because the database can read your disk. AuraDB is cloud-hosted – it has no access to your local filesystem. Rather than fail, Claude Code reasoned through it and pivoted entirely:</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss17-python-pivot.png" alt="Claude Code writing import_aura.py using the Python neo4j driver" />
<figcaption>Python + the Neo4j driver is already installed. Claude Code rewrote the import as 187 lines of batched UNWIND + MERGE -- reads CSVs locally, pushes data through the driver. No file path problem.</figcaption>
</figure>

<p>This is the kind of thing that costs an hour of Stack Overflow searching if you hit it alone. Claude Code caught it, explained it, and fixed it without being asked.</p>

<h2 id="step-5-set-up-a-free-neo4j-aura-instance">Step 5: Set up a free Neo4j Aura instance</h2>

<div class="instruction"><span class="step-label">a</span> Go to <a href="https://console.neo4j.io">console.neo4j.io</a> and sign up with Google or GitHub. No credit card required.</div>

<p>The onboarding builds a live graph of your answers as you fill in the form – you’re already thinking in nodes and relationships before you’ve written a single line of Cypher.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss19-aura-onboarding-graph.png" alt="Aura onboarding showing a graph being built from form answers" />
<figcaption>Aura builds a graph of your onboarding answers in real time. A nice preview of what's coming.</figcaption>
</figure>

<div class="instruction"><span class="step-label">b</span> Go to <strong>Instances &rarr; Create instance</strong> and select <strong>Free</strong>.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss22-aura-free-tier.png" alt="Aura instance tier selection showing Free tier selected at $0/hour" />
<figcaption>AuraDB Free: up to 200k nodes and 400k relationships. $0/hour. Note: auto-deleted after 30 days of inactivity -- keep it active or export your data.</figcaption>
</figure>

<div class="instruction"><span class="step-label">c</span> Name your instance <code>StarWars_Lego_DB</code> and click <strong>Create</strong>.</div>

<div class="instruction"><span class="step-label">d</span> &#9888;&#65039; <strong>Critical:</strong> Aura shows your password exactly once. Click <strong>Download and continue</strong> before closing this screen -- the downloaded file has your URI, username, and password.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss24-credentials-warning.png" alt="Credentials screen with password warning saying it won't be available after this point" />
<figcaption>Download the credentials file before you close this. You will not see the password again.</figcaption>
</figure>

<p>Within about 60 seconds your instance is running.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss25-instance-running.png" alt="Aura instances page showing StarWars_Lego_DB running with 0 nodes and 0 relationships" />
<figcaption>StarWars_Lego_DB -- RUNNING. 0 nodes, 0 relationships. About to change.</figcaption>
</figure>

<h2 id="step-6-run-the-import">Step 6: Run the import</h2>

<div class="instruction"><span class="step-label">a</span> Back in Claude Code, tell it to run the import against your instance. Select <strong>Neo4j AuraDB</strong>, then <strong>"I'll provide credentials now"</strong> and paste in your URI, username, and password from the downloaded credentials file.</div>

<p>Claude Code runs <code class="language-plaintext highlighter-rouge">import_aura.py</code> and reports back.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss28-import-complete.png" alt="Import complete table showing all node and relationship counts" />
<figcaption>Import complete. 494 Theme nodes, 27,195 Set nodes, 16,989 Minifig nodes. 2 minutes 11 seconds.</figcaption>
</figure>

<div class="instruction"><span class="step-label">b</span> Verify in the Aura Query editor -- go to your instance, click <strong>Connect &rarr; Query</strong>, and run the verification query Claude Code provides.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss29-aura-nodes-confirmed.png" alt="Aura Query editor showing database information with Minifig, Set, Theme labels" />
<figcaption>44,678 nodes. 50,937 relationships. Every label and relationship type exactly as defined in the schema file.</figcaption>
</figure>

<h2 id="step-7-these-arent-the-star-wars-themes-youre-looking-for">Step 7: These aren’t the Star Wars themes you’re looking for</h2>

<p>The Rebrickable CSVs contain every LEGO set ever made. We only want Star Wars.</p>

<div class="instruction"><span class="step-label">a</span> Ask Claude Code in plain English:</div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Find all themes in the database that are related to Star Wars
</code></pre></div></div>

<p>It wrote and ran a graph traversal query using the <code class="language-plaintext highlighter-rouge">HAS_PARENT</code> relationship hierarchy. Initial result: 2 themes. I pushed back – I knew there were more than two.</p>

<p>Claude Code investigated with a diagnostic script and found the bug: the original query’s <code class="language-plaintext highlighter-rouge">NOT EXISTS</code> guard was too strict. There are actually 5 nodes named “Star Wars” in the data – the root theme plus sub-themes under Technic, Advent, and Mindstorms that were silently excluded.</p>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss32-five-themes-found.png" alt="Five Star Wars themes table showing all ids and parent themes" />
<figcaption>All 5 Star Wars themes. The "hidden" three were Star Wars licensing applied to Technic, Advent calendars, and Mindstorms -- children of those parent themes, not of the Star Wars root.</figcaption>
</figure>

<p>I pushed back using nothing but domain knowledge. I didn’t write a query. I didn’t debug the code. I just knew there were more Star Wars themes and said so. The agent investigated, found its own mistake, and corrected it.</p>

<p><em>(I’d built this database once before and found 4 themes. Now there are 5 – Rebrickable updates daily. The data reflects the real world.)</em></p>

<div class="instruction"><span class="step-label">b</span> Ask Claude Code to clear the database and re-import with only Star Wars data.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss34-filter-chain-code.png" alt="Filter chain code showing Python filtering each CSV before touching the database" />
<figcaption>The filter chain: themes &rarr; sets &rarr; inventories &rarr; inventory_minifigs &rarr; minifigs. Every CSV filtered in Python before a single node touches the database. Nothing non-Star Wars can leak in.</figcaption>
</figure>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss35-starwars-only-import.png" alt="Star Wars only import complete showing 5 themes, 1124 sets, 1529 minifigs" />
<figcaption>Pure Star Wars. 5 themes, 1,124 sets, 1,529 minifigs, 2,276 INCLUDES_MINIFIG relationships. Down from 27,195 sets and 16,989 minifigs.</figcaption>
</figure>

<h2 id="step-8-these-are-the-droids-youre-looking-for">Step 8: These are the droids you’re looking for</h2>

<div class="instruction"><span class="step-label">a</span> Ask Claude Code your question in plain English:</div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Since I don't know Cypher and I want to use the power of a Graph Database 
where relationships are first class citizens -- tell me which Star Wars set 
has the most minifigures?
</code></pre></div></div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss36-death-star-answer.png" alt="Claude Code answer showing Death Star result with Cypher and plain English explanation" />
<figcaption>Winner: the 2008 Death Star (10188-1) with 48 minifigures across 23 distinct characters. The graph walked relationships directly -- no table joins, no intermediate scans. The 2025 Death Star flips it: 39 distinct characters but only 40 total, meaning almost every minifig in that box is a different person.</figcaption>
</figure>

<div class="instruction"><span class="step-label">b</span> Ask Claude Code to write a visualization query. Paste the result into the Aura Query editor and switch to <strong>Graph</strong> view.</div>

<figure>
<img src="/assets/posts/star-wars-lego-walkthrough/ss37-death-star-graph.png" alt="Neo4j graph visualization showing Death Star as hub node with minifig nodes radiating out" />
<figcaption>The 2008 Death Star as a hub node with every minifig radiating out via INCLUDES_MINIFIG edges. Han Solo appears twice -- two distinct minifig variants with different head molds. The graph captures that automatically.</figcaption>
</figure>

<h2 id="what-this-actually-gives-you">What this actually gives you</h2>

<p>From five CSVs to a queryable, visualizable Star Wars graph – no Cypher knowledge required, no database needed to define the schema, and every query validated against a file that existed before the first node was written.</p>

<p>The workflow in one line: <strong>define → import → query</strong>, with the schema as ground truth the whole way through.</p>

<p>I started this wanting to answer one question: which Star Wars set has the most minifigures? I ended up contributing to an open source skill that makes the whole workflow possible for anyone starting from scratch.</p>

<p>Install it with one command:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npx skills add neo4j-contrib/neo4j-skills/neo4j-cypher-skill
</code></pre></div></div>

<p>Drop a <code class="language-plaintext highlighter-rouge">&lt;db-name&gt;-schema.json</code> in your project root. Point Claude Code at it. The rest follows.</p>

<p><em>The 2008 Death Star has been sitting one-third built on my shelf since 2008. Maybe now that it’s fully assembled in a graph database, I’ll finally finish the real one.</em></p>

<p><em>The original guardrail project: <a href="https://github.com/andwaller/neo4j-dynamic-schema-guardrail">github.com/andwaller/neo4j-dynamic-schema-guardrail</a></em>
<em>The cypher skill it became: <a href="https://github.com/neo4j-contrib/neo4j-skills">neo4j-contrib/neo4j-skills</a></em></p>]]></content><author><name>Ari Waller</name></author><category term="neo4j" /><category term="ai" /><category term="open-source" /><summary type="html"><![CDATA[From a blank Zed window to a queryable Star Wars graph -- no Cypher knowledge required.]]></summary></entry><entry><title type="html">From Star Wars LEGO to My First Open Source Contribution</title><link href="https://andwaller.github.io/2026/06/07/star-wars-lego-open-source-contribution.html" rel="alternate" type="text/html" title="From Star Wars LEGO to My First Open Source Contribution" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://andwaller.github.io/2026/06/07/star-wars-lego-open-source-contribution</id><content type="html" xml:base="https://andwaller.github.io/2026/06/07/star-wars-lego-open-source-contribution.html"><![CDATA[<p>I’ve always wanted to build a Star Wars LEGO database. Not for work. Just because I wanted to: every set, every minifigure, every relationship between themes and years and pieces, all of it queryable in a graph. The problem was I never had a good place to start.</p>

<p>Without an existing database, most tools assume you already know what you’re building. I didn’t. I had a pile of CSV files from Rebrickable and an idea.</p>

<p>That small frustration turned into something I didn’t expect: my first merged contribution to an open source repository.</p>

<h2 id="a-new-hope-the-force-was-a-session">A New Hope: The Force Was a Session</h2>

<p>Last week our team ran a session with Zach Blumenfeld on his research into AIP (Agent Instruction Protocol) and how structured skills change the way AI agents perform. I’m not an engineer by trade, and working daily alongside a team like this makes me want to get my hands on things to better conceptualize new concepts.</p>

<p>So I did.</p>

<h2 id="these-arent-the-entities-youre-looking-for">These Aren’t the Entities You’re Looking For</h2>

<p>What I didn’t know at the time was that starting a graph project from CSV data has its own technical challenges. My plain AI agent had nothing to work from. I’d ask it to help me build a database and it would guess. Confidently, plausibly, and incorrectly.</p>

<p>Neo4j Agent Skills to the rescue – these encapsulate expert knowledge on graph data modeling, cypher generation and import.</p>

<p>I wanted to define the schema first, before the database existed. Tell the agent: here are the nodes, here are the relationships, here are the properties, now help me build it correctly.</p>

<p>The result was <code class="language-plaintext highlighter-rouge">neo4j-dynamic-schema-guardrail</code>: a <code class="language-plaintext highlighter-rouge">SKILL.md</code> file and a schema snapshot that any AI coding agent picks up automatically. No server, no library, no plugin, no live connection required. The agent reads the schema file before generating any Cypher, validates every entity against it, and halts with a structured report if something doesn’t exist.</p>

<p>I used it to load five Star Wars LEGO themes, 1,122 sets, and 1,528 minifigures into a Neo4j graph, built entirely from CSVs, with validated import scripts, before a single node was written. It worked better than I expected.</p>

<h2 id="go-see-michael">Go See Michael</h2>

<p>When my VP saw what I’d accidentally built, he suggested I run it by Michael Hunger, VP of Product Innovation at Neo4j, to see if the project had value for the broader Neo4j community – specifically the neo4j-skills repository. I reached out with what I thought was a polite, low-pressure check-in.</p>

<p>Michael’s response was immediate and direct.</p>

<blockquote>
  <p>“Did you check the cypher skill we have in the skills repository? Would love to get contributions to that one.”</p>
</blockquote>

<p>I’d thought I was at the end of an accidental side project. That one question changed the coordinates.</p>

<p>Before going back to Michael, I did the work of understanding where the guardrail fit. I installed the cypher skill and ran it the way I’d been working in a session with no live database connection to see what happened.</p>

<p>The cypher skill is built to validate against a live database: it reads the real schema before it writes Cypher. With no connection, it has no schema to read, so it does the reasonable thing and infers one. When I asked it to find all minifigures in a set, it generated:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MATCH (s:Set {set_num: $setNum})-[:CONTAINS]-&gt;(m:Minifigure)
RETURN m.fig_num AS figNumber, m.name AS name, m.num_parts AS parts
</code></pre></div></div>

<p>None of those entities exist in my database. The label is <code class="language-plaintext highlighter-rouge">:Minifig</code>, not <code class="language-plaintext highlighter-rouge">:Minifigure</code>; the relationship is <code class="language-plaintext highlighter-rouge">:HAS_MINIFIG</code>, not <code class="language-plaintext highlighter-rouge">:CONTAINS</code>; the property is <code class="language-plaintext highlighter-rouge">id</code>, not <code class="language-plaintext highlighter-rouge">set_num</code>. The query is plausible, and without a schema to check against there’s no way to know it’s wrong. That’s not the skill failing – it’s what happens to any tool when the schema isn’t available.</p>

<p>The guardrail reads the schema from a file, so it has something to check against even with no connection:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Schema Validation
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Node: Set          | ✅ FOUND
Node: Minifig      | ✅ FOUND
Rel: HAS_MINIFIG   | ✅ FOUND (Set -&gt; Minifig)
Property: name     | ✅ STRING
Property: fig_num  | ✅ STRING
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

MATCH (s:Set {id: $setId})-[:HAS_MINIFIG]-&gt;(m:Minifig)
RETURN m.name AS minifigName, m.fig_num AS figNum, m.num_parts AS numParts
ORDER BY m.name
</code></pre></div></div>

<p>Where each tool fits:</p>

<ul>
  <li><strong>graph-guard</strong> – real-time validation through a Bolt proxy server.</li>
  <li><strong>cypher-query-validator</strong> – a TypeScript library you integrate into your code.</li>
  <li><strong>neo4j-cypher-skill</strong> – validates against a live database connection.</li>
  <li><strong>neo4j-dynamic-schema-guardrail</strong> – file-based, works without a connection, define-first workflow.</li>
</ul>

<p>I put together a full evaluation brief, a live side-by-side comparison with real test outputs, and a complete session log, and sent all three back to Michael.</p>

<p>That’s when the real conversation started.</p>

<h2 id="padawan-github-project-training">Padawan Github Project Training</h2>

<p>Over the course of one day, Michael gave me feedback that changed how I thought about the project. Not the core mechanism, but everything around it.</p>

<blockquote>
  <p>“The LLM doesn’t read the README. It reads SKILL.md.”</p>
</blockquote>

<blockquote>
  <p>“I don’t think you need the repository layout section.”</p>
</blockquote>

<blockquote>
  <p>“Replace the screenshot with copyable text.”</p>
</blockquote>

<blockquote>
  <p>“Does it attempt to map synonyms before halting?”</p>
</blockquote>

<p>This question became a feature. If someone asks for <code class="language-plaintext highlighter-rouge">Minifigure</code> and the schema has <code class="language-plaintext highlighter-rouge">Minifig</code>, the original skill just halted. Michael asked whether it could suggest the close match first, and he was specific about the logic: if the match is unambiguous, resolve it silently and continue. Only halt if it’s genuinely ambiguous.</p>

<blockquote>
  <p>“Show the empty-database and import workflow clearly in ‘How It Works.’”</p>
</blockquote>

<p>The most valuable thing I’d built – defining a schema from CSV before a database exists – wasn’t clearly described anywhere.</p>

<blockquote>
  <p>“Add support for the schema format in the neo4j-graphrag-python package.”</p>
</blockquote>

<blockquote>
  <p>“Apply AGENTS.md to condense the skill.”</p>
</blockquote>

<p>The principle is called “caveman compression”: remove articles, politeness, conjunctions, and explanatory padding, and keep technical content untouched.</p>

<p>Each time Michael gave feedback, I passed it directly to Claude and pushed the updates. At one point he wrote:</p>

<blockquote>
  <p>“you can just pass my feedback to Claude and let it fix it.”</p>
</blockquote>

<p>Which made me laugh, because that’s exactly what I was doing.</p>

<h2 id="the-contribution-itself">The Contribution Itself</h2>

<p>I’d never contributed to another open source project before in a technical way. Michael’s instruction was simple:</p>

<blockquote>
  <p>“Make a fork of the skills repo, have Claude clone it, tell it to apply and integrate the skill into a new branch, and open a pull request. You can just paste this instruction to Claude.”</p>
</blockquote>

<p>So I did. It forked <code class="language-plaintext highlighter-rouge">neo4j-contrib/neo4j-skills</code>, created a branch, migrated the Python scripts and validation logic from the guardrail into the cypher skill, and opened PR #32.</p>

<h2 id="michaels-final-edit-from-the-plane">Michael’s Final Edit, From the Plane</h2>

<p>While in the air, Michael made one last change himself. He softened the strict “halt on failure” behavior into something more nuanced: only halt when the problem genuinely can’t be mitigated. Otherwise, propose a resolution, ask the user if needed, and proceed.</p>

<blockquote>
  <p>A guardrail that always stops is a blocker. One that tries to find a path forward first is a collaborator.</p>
</blockquote>

<p>That shift was the last thing that went in before the PR merged.</p>

<h2 id="what-i-learned">What I Learned</h2>

<p>The code changed less than I expected. The scripts mostly stayed intact. The validation logic was largely the same. What changed was clarity: about who reads what, what belongs where, what the tool is actually for, and how it should behave when something goes wrong.</p>

<p>The guardrail handles the <em>what</em>: are these entities real?
The cypher skill handles the <em>how</em>: is this query well-formed?
Neither replaces the other. That’s the complementary relationship.</p>

<p>I started out wanting to build a Star Wars LEGO database without hallucinated Cypher. I ended up with my first open source contribution, a much better understanding of how AI agent skills actually work, and a real lesson in the difference between something that works and something that’s ready to share.</p>

<p>The original guardrail lives at <a href="https://github.com/andwaller/neo4j-dynamic-schema-guardrail">github.com/andwaller/neo4j-dynamic-schema-guardrail</a>, and the neo4j-cypher-skill it is now is part of <a href="https://github.com/neo4j-contrib/neo4j-skills">neo4j-contrib/neo4j-skills</a>.</p>

<p><em>Originally published on the Neo4j Developer Blog, June 2026.</em></p>]]></content><author><name>Ari Waller</name></author><category term="neo4j" /><category term="ai" /><category term="open-source" /><summary type="html"><![CDATA[I wanted to build a Star Wars LEGO database. That small frustration turned into something I didn't expect: my first merged contribution to an open source repository.]]></summary></entry><entry><title type="html">Neo4j &amp;amp; Graph-Powered AI</title><link href="https://andwaller.github.io/2026/04/01/neo4j-graph-powered-ai-devnexus.html" rel="alternate" type="text/html" title="Neo4j &amp;amp; Graph-Powered AI" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T00:00:00+00:00</updated><id>https://andwaller.github.io/2026/04/01/neo4j-graph-powered-ai-devnexus</id><content type="html" xml:base="https://andwaller.github.io/2026/04/01/neo4j-graph-powered-ai-devnexus.html"><![CDATA[<style>
.video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin: 2em 0; }
.video-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }
</style>

<div class="video-wrapper">
  <iframe src="https://www.youtube.com/embed/Cpza5MpF3Hk" allowfullscreen=""></iframe>
</div>

<p><em>Presented at Devnexus / Atlanta Java Users Group, 2026. A conversation with Jeremy Adams-Casañas on Neo4j, graph-powered AI, and how the Atlanta tech community shaped a career path from technical recruiting to developer relations.</em></p>]]></content><author><name>Ari Waller</name></author><category term="presentations" /><category term="neo4j" /><category term="ai" /><summary type="html"><![CDATA[Show up, give before you take, stay consistent. A conversation on Neo4j, graph-powered AI, and the Atlanta tech community.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andwaller.github.io/assets/thumbnails/neo4j-graph-ai.jpg" /><media:content medium="image" url="https://andwaller.github.io/assets/thumbnails/neo4j-graph-ai.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Spoiler Alert: Your Vibe Code Isn’t Impressing Software Engineers</title><link href="https://andwaller.github.io/2025/10/21/vibe-code-not-impressing-engineers.html" rel="alternate" type="text/html" title="Spoiler Alert: Your Vibe Code Isn’t Impressing Software Engineers" /><published>2025-10-21T00:00:00+00:00</published><updated>2025-10-21T00:00:00+00:00</updated><id>https://andwaller.github.io/2025/10/21/vibe-code-not-impressing-engineers</id><content type="html" xml:base="https://andwaller.github.io/2025/10/21/vibe-code-not-impressing-engineers.html"><![CDATA[<p>How a well-intentioned prototype, an awkward Google Meet moment, and a little humility taught me the difference between vibing and AI paired programming.</p>

<h2 id="the-incident-and-touch-of-humanity">The Incident and Touch of Humanity</h2>

<p>I work with an incredible engineering team at Neo4j. Our DevRel engineers are no exception, but they’re also very busy. I’ve been working on a community forums “game changer” that requires collaboration with one of my software developer colleagues. I thought I’d prepare by sharing a prototype, my “bit of vibe code”, to show what a possible solution could look like.</p>

<p>I was excited. For a moment, I thought I was building something special, or a spark for sharing a prototype worth collaborating on. I vibed hard. The UI front end looked pretty good for what we wanted to accomplish.</p>

<p>And then IT happened. My engineering colleague opened the doc.</p>

<p>Then came the look… Followed by a long, awkward silence that sucked the air out of the virtual room.</p>

<p>Finally, he said, trying to be polite but referring to some of the code I’d written:</p>

<blockquote>
  <p>“So, we need the ID to be able to identify the user… like, the code that you’ve got here… did you generate that with Claude or ChatGPT or something?”</p>
</blockquote>

<p>“No, I wrote that by hand… with no engineering experience whatsoever.”</p>

<p>I tried to joke to lower the room temperature. Not funny. More silence.</p>

<p>Then he started walking through all the flawed backend security code I’d added, none of which had anything to do with what I actually wanted to discuss. I just wanted to show him my UI and get his thoughts on whether it had value.</p>

<p>He continued:</p>

<blockquote>
  <p>“Um, so I’m being honest. I’m finding this quite frustrating. It’s the kind of vibe-coded approach that’s only going to end up with more work for me in the long run.”</p>
</blockquote>

<h2 id="some-context-not-excuses">Some Context… Not Excuses</h2>

<p>When the term vibe code became popularized by Andrej Karpathy earlier this year, it clicked for me. Maybe I could start finally bringing some of my ideas to life. Things I’d normally need a software developer to do.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>10 PRINT "Hello!"
20 GOTO 10
</code></pre></div></div>

<p>That’s about as far as I got with my coding career.</p>

<p>What I didn’t realize while preparing for this call was that my attempt to help actually detracted from the goal and could have unintentionally built a wall between myself and the engineering team. I never thought I’d built a secure application, but noble intentions aside, I messed up. Big time.</p>

<h2 id="reflection-did-i-save-time-no">Reflection… Did I Save Time… NO!</h2>

<p>I’ve spent my entire career admiring, advocating for, and promoting the skill set of developers. So how could I have shown such a lack of respect for the art and craftsmanship that goes into software engineering, even unintentionally?</p>

<ul>
  <li>Showing a fine artist a finger painting and calling it a collaboration.</li>
  <li>Handing a surgeon a multitool and saying, “This might help.”</li>
  <li>Submitting a bridge concept drawn in crayon to a structural review.</li>
  <li>Walking into a jazz quartet with a drum machine set to “demo mode.”</li>
</ul>

<p>The good news: I was in a safe space with a trusted colleague. A few days later, I called him back to sincerely apologize. He apologized too, saying maybe he’d been too blunt, but I disagreed. It was a much-needed lesson for me, and maybe one for anyone reading this.</p>

<p>AI may be known for hallucinations, but let’s not hallucinate ourselves into believing we can plug something into an LLM and suddenly call ourselves experts.</p>

<p>Engineers are connoisseurs. They don’t just build; they curate. Each line of code carries intention, security, and beauty. They see risk where I see rhythm. I painted with broad strokes, skipping the fine details. And the real engineer? They weren’t dismissing me. They were protecting the canvas.</p>

<h2 id="the-takeaway-from-the-watershed">The Takeaway from the Watershed</h2>

<p>So yes, spoiler alert: your vibe code isn’t impressing engineers. But that’s okay. Sometimes, the most valuable feedback you’ll ever get isn’t praise; it’s a sigh, a silence, and a moment of truth that helps you grow from vibing to building.</p>

<p>My personal takeaway: the word vibe feels so casual. Coding is anything but. If you’re not a technologist (like me), you’re a vibe coder. But when a software engineer uses a GenAI tool, that’s AI paired programming.</p>

<p><em>Originally published on <a href="https://medium.com/@ari_waller/spoiler-alert-your-vibe-code-isnt-impressing-software-engineers-1eccdf8b53c6">Medium</a> and <a href="http://ivibecode.ai/?i=1">IVibeCode.ai</a>, October 2025.</em></p>]]></content><author><name>Ari Waller</name></author><category term="ai" /><category term="community" /><summary type="html"><![CDATA[How a well-intentioned prototype, an awkward Google Meet moment, and a little humility taught me the difference between vibing and AI paired programming.]]></summary></entry><entry><title type="html">Neo4j Certification: What’s the Value?</title><link href="https://andwaller.github.io/2025/06/23/neo4j-certification-value.html" rel="alternate" type="text/html" title="Neo4j Certification: What’s the Value?" /><published>2025-06-23T00:00:00+00:00</published><updated>2025-06-23T00:00:00+00:00</updated><id>https://andwaller.github.io/2025/06/23/neo4j-certification-value</id><content type="html" xml:base="https://andwaller.github.io/2025/06/23/neo4j-certification-value.html"><![CDATA[<p>Before I joined Neo4j and the world of B2B developer relations, I spent years in the technical recruiting industry placing software engineers – hundreds across startups, scale-ups, and enterprise teams. And one question I received almost every day from technology candidates was, “Is it worth it to get __________ certification?”</p>

<p>My answer? “Only if it represents what you’re truly capable of.”</p>

<p>Let me explain.</p>

<h2 id="skills-speak-for-themselves">Skills Speak for Themselves</h2>

<p>Hiring managers don’t just want to know what you’ve read; they want to know what you’ve built. In countless interviews and hiring discussions, what stood out wasn’t just the list of technologies on a resume but how a candidate could talk about their work, explain trade-offs, and show real-world problem-solving.</p>

<p>It wasn’t about buzzwords or just saying “I’m certified!” It was about capability.</p>

<p>When developers take the time to level up on their own terms, whether through side projects, community involvement, or certifications that <em>actually require</em> hands-on work, they signal something bigger: initiative, curiosity, and a deep engagement with their craft.</p>

<p><strong>Real skills. Real curiosity. Real passion for building.</strong></p>

<p>If that resonates with you, you’re exactly the kind of developer who stands to benefit from earning a Neo4j certification.</p>

<h2 id="why-neo4j-certification-matters">Why Neo4j Certification Matters</h2>

<p>One thing I value most about working at Neo4j is our genuine commitment to the developer community. We offer free Neo4j courses and certifications on GraphAcademy because we believe high-quality graph database education should be accessible to everyone. The certification may be accessible at no cost, but it must still be earned.</p>

<p>So why does it matter?</p>

<p><em>It proves you can do the work.</em></p>

<p>GraphAcademy isn’t set up for passive learning. You’re not just clicking through slides or memorizing concepts for a quiz. You’re writing Cypher queries, modeling real data with nodes, relationships, and properties that mirror the complexity of real-world systems. The path toward becoming a Neo4j Certified Professional is hands-on by design. You’re asked to demonstrate understanding, not just recall.</p>

<p><em>It gives you an edge in AI and emerging tech.</em></p>

<p>Knowledge graphs are becoming a foundational component of AI and agentic systems, especially in retrieval-augmented generation (RAG), recommendations, and context-aware applications. As part of the emerging Model Context Protocol (MCP), graphs play a critical role in enabling LLMs to access structured, dynamic knowledge. Certification prepares you to show how you can build the data layer on which modern AI depends.</p>

<p><em>It connects you to a real community.</em></p>

<p>Learning solo can be rough. That’s why the Neo4j dev community – including Discord and discussion forums – are such a game-changer. They’re packed with thousands of engineers, data folks, and graph experts who are building real projects, swapping ideas, and debugging together. Whether you’re stuck on a query or exploring a new use case, there’s always someone who’s been there and is ready to help.</p>

<p><em>It unlocks what’s next.</em></p>

<p>Want to go deeper? Tracks like Neo4j Graph Data Science and Neo4j Certified Professional both build on this foundation. The certification is your launch point for more advanced graph learning. Pair the cert with a side project, and you have proof of work. Something real you can show, explain, and use to spark deeper conversations.</p>

<h2 id="summary">Summary</h2>

<p>Neo4j certification isn’t just a free t-shirt, an online certificate, and a community badge. It’s a signal to yourself, your peers, and future collaborators that you’re serious about building what’s next. Whether exploring the future of AI, diving into data modeling, or adding graph capabilities to your developer toolkit, this certification helps you stand out with practical, proven, and in-demand skills.</p>

<h2 id="ready-to-build-whats-next">Ready to Build What’s Next?</h2>

<p>If you’re the type of developer who learns by doing, this is your moment. Take the challenge, earn the certification, and show the world what you can build. It’s a declaration that you have the ability to apply what you know and graph data to solve real-world problems, especially in an AI-driven future.</p>

<ul>
  <li><a href="https://graphacademy.neo4j.com/categories/certification/">Start the Neo4j Certified Professional certification</a></li>
  <li><a href="https://graphacademy.neo4j.com">Explore all GraphAcademy learning tracks</a></li>
  <li><a href="https://community.neo4j.com">Join the Neo4j Developer Community and our Discord</a></li>
</ul>

<p><em>Originally published on the Neo4j Developer Blog, June 2025.</em></p>]]></content><author><name>Ari Waller</name></author><category term="neo4j" /><category term="community" /><summary type="html"><![CDATA[Master the knowledge graph behind GenAI and certify your skills -- but only if it represents what you're truly capable of.]]></summary></entry><entry><title type="html">Java Career Market Trends for 2023 &amp;amp; Beyond</title><link href="https://andwaller.github.io/2023/07/16/ajug-java-career-market-trends-2023.html" rel="alternate" type="text/html" title="Java Career Market Trends for 2023 &amp;amp; Beyond" /><published>2023-07-16T00:00:00+00:00</published><updated>2023-07-16T00:00:00+00:00</updated><id>https://andwaller.github.io/2023/07/16/ajug-java-career-market-trends-2023</id><content type="html" xml:base="https://andwaller.github.io/2023/07/16/ajug-java-career-market-trends-2023.html"><![CDATA[<style>
.video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin: 2em 0; }
.video-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }
</style>

<div class="video-wrapper">
  <iframe src="https://player.vimeo.com/video/850057285" allowfullscreen=""></iframe>
</div>

<p><em>Presented at the Atlanta Java Users Group (AJUG), July 2023. Co-presented with Joseph Krull.</em></p>]]></content><author><name>Ari Waller</name></author><category term="presentations" /><category term="career" /><summary type="html"><![CDATA[An AJUG presentation on where the Java job market is heading, co-presented with Joseph Krull.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andwaller.github.io/assets/thumbnails/java-2023-ajug.jpg" /><media:content medium="image" url="https://andwaller.github.io/assets/thumbnails/java-2023-ajug.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Technical Recruiters: Choosing One That’s Worth Your Time</title><link href="https://andwaller.github.io/2021/06/23/devops-meetup-technical-recruiters.html" rel="alternate" type="text/html" title="Technical Recruiters: Choosing One That’s Worth Your Time" /><published>2021-06-23T00:00:00+00:00</published><updated>2021-06-23T00:00:00+00:00</updated><id>https://andwaller.github.io/2021/06/23/devops-meetup-technical-recruiters</id><content type="html" xml:base="https://andwaller.github.io/2021/06/23/devops-meetup-technical-recruiters.html"><![CDATA[<style>
.video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin: 2em 0; }
.video-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }
</style>

<div class="video-wrapper">
  <iframe src="https://www.youtube.com/embed/p2cmet5-SOA" allowfullscreen=""></iframe>
</div>

<p><em>Presented at Seattle DevOps Meetup, June 23, 2021.</em></p>]]></content><author><name>Ari Waller</name></author><category term="presentations" /><category term="career" /><summary type="html"><![CDATA[How to find and work with a technical recruiter who will actually advocate for you.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andwaller.github.io/assets/thumbnails/technical-recruiters-seattle.jpg" /><media:content medium="image" url="https://andwaller.github.io/assets/thumbnails/technical-recruiters-seattle.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Choosing a Tech Recruiter Worth Your Time</title><link href="https://andwaller.github.io/2020/06/25/sandiego-python-choosing-tech-recruiter.html" rel="alternate" type="text/html" title="Choosing a Tech Recruiter Worth Your Time" /><published>2020-06-25T00:00:00+00:00</published><updated>2020-06-25T00:00:00+00:00</updated><id>https://andwaller.github.io/2020/06/25/sandiego-python-choosing-tech-recruiter</id><content type="html" xml:base="https://andwaller.github.io/2020/06/25/sandiego-python-choosing-tech-recruiter.html"><![CDATA[<style>
.video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin: 2em 0; }
.video-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }
</style>

<div class="video-wrapper">
  <iframe src="https://www.youtube.com/embed/rcmCht-MN2I" allowfullscreen=""></iframe>
</div>

<p><em>Presented at San Diego Python virtual meetup, June 25, 2020.</em></p>]]></content><author><name>Ari Waller</name></author><category term="presentations" /><category term="career" /><summary type="html"><![CDATA[What to look for -- and what to avoid -- when working with a technical recruiter.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andwaller.github.io/assets/thumbnails/tech-recruiter-sandiego.jpg" /><media:content medium="image" url="https://andwaller.github.io/assets/thumbnails/tech-recruiter-sandiego.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Atlanta Tech Meetup’s Selfless Act Exemplifies Community</title><link href="https://andwaller.github.io/2020/02/26/atlanta-tech-meetups-community.html" rel="alternate" type="text/html" title="Atlanta Tech Meetup’s Selfless Act Exemplifies Community" /><published>2020-02-26T00:00:00+00:00</published><updated>2020-02-26T00:00:00+00:00</updated><id>https://andwaller.github.io/2020/02/26/atlanta-tech-meetups-community</id><content type="html" xml:base="https://andwaller.github.io/2020/02/26/atlanta-tech-meetups-community.html"><![CDATA[<p>What happened when a tech conference was canceled?</p>

<p>Which is a better JavaScript or Java? Well, when the chips were down, and an anticipated conference, ngAtlanta, was canceled for both paid attendees and sponsors, the answer to that question really did not matter. What did matter was the actions the Atlanta Java Users Group (AJUG) took to ensure the ngAtlanta community were taken care of in their time of need.</p>

<p>If you think putting on a successful conference is easy, think again. It takes a lot of experience and know-how, and even then, a wrong decision can be costly enough to tank the whole event. The leaders of AJUG, Vincent Meyers and Pratik Patel, have learned through many years of experience (and bumps and bruises along the way) how a disappointment like this can impact the morale and confidence in the tech community.</p>

<p>Perhaps this is why when I commended Vincent on their heroic actions he humbly and simply stated, “we could do it, so we did.”</p>

<p>Every year, AJUG puts on Devnexus, the largest independent software development conference in the country. This year, with the Georgia World Conference Center (GWCC) as their venue, 2400+ attendees as well as scores of sponsors, gathered in Atlanta. With only 2 weeks to spare, Vincent and Pratik heard the disappointing news: ngAtlanta was canceled, and those attendees and sponsors who had paid were “out of luck” as no refunds were being offered.</p>

<p>The AJUG and Devnexus team swiftly jumped into action. With the help of Angel Banks, an Atlanta tech community hero who is a director of the Atlanta Women Who Code chapter and organizer of Refactr.Tech – an Atlanta tech conference with a focus on diversity and inclusion – they contacted paid attendees, sponsors and speakers scheduled to participate in ngAtlanta. They used their venue at the GWCC to put on a conference-within-a-conference for the ngAtlanta community which included meeting space, audio/video equipment, parking, food, parties, raffles, and swag. Oh yeah, they also made all Devnexus conference sessions, and an extra conference day available to those who had already paid to go to ngAtlanta.</p>

<p>This year, I was honored to be part of a technical conference that not only exceeded the expectations of those who attended but also took swift action to unify the community.</p>

<p><em>Originally published on Medium, February 2020.</em></p>]]></content><author><name>Ari Waller</name></author><category term="community" /><summary type="html"><![CDATA[When ngAtlanta was canceled two weeks out, the Atlanta Java Users Group didn't hesitate.]]></summary></entry><entry><title type="html">Current Trends in the PHP Job Market in 2020</title><link href="https://andwaller.github.io/2020/01/01/php-job-market-trends-2020.html" rel="alternate" type="text/html" title="Current Trends in the PHP Job Market in 2020" /><published>2020-01-01T00:00:00+00:00</published><updated>2020-01-01T00:00:00+00:00</updated><id>https://andwaller.github.io/2020/01/01/php-job-market-trends-2020</id><content type="html" xml:base="https://andwaller.github.io/2020/01/01/php-job-market-trends-2020.html"><![CDATA[<style>
.video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin: 2em 0; }
.video-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }
</style>

<div class="video-wrapper">
  <iframe src="https://player.vimeo.com/video/390940682" allowfullscreen=""></iframe>
</div>

<p><em>Presented in 2020.</em></p>]]></content><author><name>Ari Waller</name></author><category term="presentations" /><category term="career" /><summary type="html"><![CDATA[A look at where PHP developer hiring was heading in 2020.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andwaller.github.io/assets/thumbnails/php-2020.jpg" /><media:content medium="image" url="https://andwaller.github.io/assets/thumbnails/php-2020.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>