The Code Corner

Building an AI Agent That Builds Oracle APEX Apps

Written by Marco Pereira | Mar 9, 2026 12:00:01 PM

A Step-by-Step Guide with OpenClaw

What happens when you give an AI its own computer? A step-by-step tutorial on building an autonomous AI agent with OpenClaw that navigates Oracle APEX, creates database tables, builds dashboards, and communicates via Slack β€” all without human intervention.

 

What happens when you give an AI its own computer?

Picture this. You have a Mac mini on your desk. You create a macOS user account for it, give it its own Google email, its own Slack, its own name. You tell it, "You are Pelon, you're my AI agent, and you're going to work with me." And then you send it a Slack message, "Build me a dashboard in Oracle APEX with crypto, weather, stock market, and news data."

And the bastard does it.

I'm not talking about copy-pasting code from ChatGPT. I'm talking about an autonomous agent that opens a browser, navigates to Oracle APEX, creates database tables, inserts data, builds pages, configures regions with PL/SQL, and sends you the link when it's done. All while you're in a meeting or grabbing coffee.

Below is an unedited screen recording of the AI agent building the entire Oracle APEX dashboard from scratch β€” navigating SQL Workshop, creating tables, inserting data, building page regions with PL/SQL, and configuring the layout. No human intervention, no cuts, no edits. Just 30 minutes of autonomous work, exactly as it happened.

πŸ‘‰ Watch the full recording: https://www.youtube.com/watch?v=JYDAuldhqV8

 

This post is the story of how I did it, and more importantly, a step-by-step tutorial so you can do the same.

 

 

 

What is OpenClaw?

OpenClaw is an open-source framework for running AI agents autonomously. Think of it as the "operating system" for your agent. It provides:

 

Tool access: shell, web browser, file system, APIs

Persistent memory: Markdown files that survive across sessions

Communication: integration with Slack, Discord, WhatsApp

Identity: a "soul file" (SOUL.md) that defines who the agent is

Autonomy: heartbeats, cron jobs, scheduled tasks

 

Full documentation is at docs.openclaw.ai.

Unlike using Claude or GPT in the browser, an agent with OpenClaw can execute code, browse the web, send messages, and remember what it did yesterday. It's the difference between talking to someone and having someone work for you.

The Setup: Mac mini as the Agent's Brain

Why a dedicated machine?

The obvious question is, why not run the agent on my laptop? Three reasons:

  1. Security and isolation: The agent has its own macOS account (pelon), its own Google account, and its own credentials. If something goes wrong, my personal account isn't affected. You never give an AI agent access to your stuff β€” you give it its own stuff.

  2. 24/7 availability: The agent runs all the time. If I get an urgent email at 3 am, the agent can detect it on its next heartbeat. If I need it to do something while I'm in a meeting, I send it a Slack message, and that's it.

  3. Fixed cost: Mac mini (Apple Silicon) + Anthropic Max plan = fixed monthly cost. No per-token API costs, no billing surprises. Anthropic's Max plan gives you unlimited access to Claude Opus 4, which is the most capable model out there right now.

The hardware and software
Component Detail
Hardware Mac mini (Apple Silicon)
OS macOS with dedicated user pelon
Runtime Node.js v25+
Framework OpenClaw
Model Claude Opus 4 (Anthropic Max plan)
Communication Slack (channel #openclaw-pelon)

 

 

 

Configuring OpenClaw Step by Step

1. Installation
# Install OpenClaw globally
npm install -g openclaw

# Verify the installation
openclaw --version
2. Initialize the workspace

OpenClaw works with a workspace directory where all the agent's configuration and memory live:

 

# Create the workspace directory
mkdir -p ~/.openclaw/workspace
cd ~/.openclaw/workspace
3. Configure the model

To use Claude Opus 4 with Anthropic's Max plan (no per-token costs), you configure the model in OpenClaw:

 

# Configure Anthropic as the provider
openclaw config set model anthropic/claude-opus-4-6

 

"Important note: With the Anthropic Max/Unlimited plan, you don't pay per token. It's a fixed monthly cost. This is key for autonomous agents that can make hundreds of calls per day β€” with a traditional API, that gets expensive fast."


4. Configure Slack

So you can talk to your agent via Slack, you need to:

  1. Create a Slack App at api.slack.com/apps

  2. Give it bot permissions: chat:write, channels:read, channels:history, reactions:write, files:read

  3. Install it in your workspace

  4. Copy the Bot User OAuth Token

  5. Create a dedicated channel (e.g., #openclaw-pelon)

# Configure the Slack token in OpenClaw
openclaw config set slack.botToken xoxb-your-token-here
openclaw config set slack.channel C098W3FHN8J

 

 

Once configured, you can send messages to the agent directly via Slack, and it responds right there. It's like having a teammate who's always online.

 

 

 

5. Start the gateway
# Start the OpenClaw daemon
openclaw gateway start

# Verify it's running
openclaw gateway status

 

 

The Agent's Soul Files

This is where OpenClaw gets interesting. Your agent has identity and memory, defined by Markdown files in the workspace.

SOUL.md β€” Who the agent is

This is the most important file. It defines the agent's personality, values, and behavior:

 

# SOUL.md

You are Pelon, Marco Pereira's AI agent.

You are a software architect assistant that helps with development,
DevOps, and technical tasks.

## Personality

- Direct and efficient
- Dry humor, Mexican style
- Technically rigorous but approachable

## Values

- Security first
- Ask before doing anything destructive
- Document everything you do

 

USER.md β€” Who your human is
# USER.md

Marco Pereira - Software Architect

- Works in consulting (Viscosity NA)
- Current client: Viscosity's Client
- Time zone: America/Chicago
- Prefers communication via Slack

 

 

AGENTS.md β€” The workspace rules

This file defines how the agent behaves in its workspace. What to read at the start of each session, when to speak, and when to stay quiet, how to handle memory, etc.

MEMORY.md β€” Long-term memory

This is where the agent stores its curated memories. It's not a log β€” it's distilled knowledge:

 

# MEMORY.md

## Marco

- Prefers meeting reminders 5 min before
- Likes coffee, don't talk to him before 9am

## Active projects

- Dashboard in Oracle APEX (in progress)
- Kanban app on Vercel (deployed)

## Lessons learned

- APEX's Page Designer is too complex to automate via browser
- Better to use the PL/SQL API directly in SQL Workshop

 

Daily memory

In addition to MEMORY.md, the agent creates daily files in memory/:

 

memory/
β”œβ”€β”€ 2026-02-08.md
β”œβ”€β”€ 2026-02-09.md
β”œβ”€β”€ 2026-02-10.md
└── heartbeat-state.json

 

Each file contains a log of what happened that day. When the agent "wakes up" in a new session, it reads the last few days for context. It's like a human reviewing their journal before starting the day.

The heartbeat system

OpenClaw has a "heartbeat" system β€” periodic pulses where the agent checks if there's anything to do:

# HEARTBEAT.md

- Check email (every 4 hours)
- Check calendar (every 2 hours)
- Verify deploy status

 

If there's nothing to do, the agent responds HEARTBEAT_OK and sleeps until the next pulse. If there's something important (an urgent email, a meeting in 30 minutes), it sends you a Slack message.

Cron jobs

For tasks with exact schedules, OpenClaw supports cron jobs:

 

# Example: morning briefing at 8:30am
openclaw cron add "30 8 * * *" "Give a summary of the day: calendar, to-dos, weather"

# Example: meeting reminder 5 min before
openclaw cron add "*/5 * * * *" "Check if there are meetings in the next 10 minutes"

 

 

The Project: Dashboard in Oracle APEX

Why Oracle APEX?

Oracle APEX is a low-code platform for building web applications on Oracle Database. I chose it for several reasons:

Free: Oracle offers a free tier at oracleapex.com β€” no credit card required

Challenging for an agent: APEX has a complex UI (Page Designer) that's hard to automate. I wanted to see how the agent would handle it

Enterprise-grade: Many large companies use APEX. Demonstrating that an agent can build in APEX has real value

What did we build?

An Open Data Dashboard with 5 sections:

  1. πŸ“Š Key Market Metrics β€” S&P 500, NASDAQ, BTC dominance, USD/MXN, inflation
  2. 🌀️ Weather Worldwide β€” Temperature and conditions in cities around the world

  3. πŸͺ™ Crypto Market β€” Prices for BTC, ETH, SOL, ADA, XRP, DOGE

  4. πŸ“ˆ Stock Market β€” AAPL, MSFT, GOOGL, AMZN, NVDA, TSLA

  5. πŸ“° Latest News β€” Tech and finance news

Public URL: oracleapex.com/ords/r/openclaw/pelon-test-app/open-data-dashboard

 

 

 

Step by Step: How the Agent Built the Dashboard

Now for the good stuff β€” the technical part. This is exactly what the agent did, in order.

Step 1: Create the database tables

The agent navigated to SQL Workshop > SQL Commands in APEX and ran the following scripts:

Market metrics table

 

CREATE TABLE dashboard_metrics (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
metric_name VARCHAR2(100) NOT NULL,
metric_value VARCHAR2(50),
change_pct VARCHAR2(20),
category VARCHAR2(50),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

Weather table

 

CREATE TABLE dashboard_weather (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
city VARCHAR2(100) NOT NULL,
country VARCHAR2(50),
temp_c NUMBER(5,1),
condition VARCHAR2(100),
humidity NUMBER(3),
wind_kph NUMBER(5,1),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

Cryptocurrency table

 

CREATE TABLE dashboard_crypto (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
symbol VARCHAR2(10) NOT NULL,
name VARCHAR2(50),
price_usd NUMBER(15,2),
change_24h NUMBER(8,2),
market_cap VARCHAR2(20),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

Stock market table

 

CREATE TABLE dashboard_finance (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
symbol VARCHAR2(10) NOT NULL,
company VARCHAR2(100),
price NUMBER(10,2),
change_pct NUMBER(6,2),
volume VARCHAR2(20),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

News table

 

CREATE TABLE dashboard_news (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title VARCHAR2(500) NOT NULL,
source VARCHAR2(100),
category VARCHAR2(50),
url VARCHAR2(500),
published TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

 

Step 2: Insert demo data

With the tables created, the agent inserted sample data:

 

-- Market metrics
INSERT INTO dashboard_metrics (metric_name, metric_value, change_pct, category)
VALUES ('S&P 500', '6,025.99', '+0.67%', 'Index');

INSERT INTO dashboard_metrics (metric_name, metric_value, change_pct, category)
VALUES ('NASDAQ', '19,391.96', '+1.35%', 'Index');

INSERT INTO dashboard_metrics (metric_name, metric_value, change_pct, category)
VALUES ('BTC Dominance', '61.2%', '+0.3%', 'Crypto');

INSERT INTO dashboard_metrics (metric_name, metric_value, change_pct, category)
VALUES ('USD/MXN', '20.45', '-0.15%', 'Forex');

INSERT INTO dashboard_metrics (metric_name, metric_value, change_pct, category)
VALUES ('US Inflation', '2.9%', '-0.1%', 'Macro');

-- Cryptocurrencies
INSERT INTO dashboard_crypto (symbol, name, price_usd, change_24h, market_cap)
VALUES ('BTC', 'Bitcoin', 97234.50, 2.34, '$1.92T');

INSERT INTO dashboard_crypto (symbol, name, price_usd, change_24h, market_cap)
VALUES ('ETH', 'Ethereum', 2685.20, -1.05, '$323B');

INSERT INTO dashboard_crypto (symbol, name, price_usd, change_24h, market_cap)
VALUES ('SOL', 'Solana', 203.45, 5.67, '$98B');

INSERT INTO dashboard_crypto (symbol, name, price_usd, change_24h, market_cap)
VALUES ('ADA', 'Cardano', 0.78, 3.21, '$27B');

INSERT INTO dashboard_crypto (symbol, name, price_usd, change_24h, market_cap)
VALUES ('XRP', 'XRP', 2.45, 1.89, '$141B');

INSERT INTO dashboard_crypto (symbol, name, price_usd, change_24h, market_cap)
VALUES ('DOGE', 'Dogecoin', 0.25, -0.45, '$37B');

-- World weather
INSERT INTO dashboard_weather (city, country, temp_c, condition, humidity, wind_kph)
VALUES ('Ciudad de MΓ©xico', 'Mexico', 22.5, 'Partly Cloudy', 45, 12.3);

INSERT INTO dashboard_weather (city, country, temp_c, condition, humidity, wind_kph)
VALUES ('New York', 'USA', -2.1, 'Snow', 78, 25.6);

INSERT INTO dashboard_weather (city, country, temp_c, condition, humidity, wind_kph)
VALUES ('Tokyo', 'Japan', 8.4, 'Clear', 55, 8.1);

INSERT INTO dashboard_weather (city, country, temp_c, condition, humidity, wind_kph)
VALUES ('London', 'UK', 5.2, 'Rainy', 82, 18.9);

INSERT INTO dashboard_weather (city, country, temp_c, condition, humidity, wind_kph)
VALUES ('SΓ£o Paulo', 'Brazil', 28.7, 'Sunny', 65, 10.4);

-- Stock market
INSERT INTO dashboard_finance (symbol, company, price, change_pct, volume)
VALUES ('AAPL', 'Apple Inc.', 232.80, 1.45, '52.3M');

INSERT INTO dashboard_finance (symbol, company, price, change_pct, volume)
VALUES ('MSFT', 'Microsoft Corp.', 410.25, 0.89, '28.1M');

INSERT INTO dashboard_finance (symbol, company, price, change_pct, volume)
VALUES ('GOOGL', 'Alphabet Inc.', 185.60, -0.32, '31.7M');

INSERT INTO dashboard_finance (symbol, company, price, change_pct, volume)
VALUES ('AMZN', 'Amazon.com Inc.', 228.15, 2.10, '45.8M');

INSERT INTO dashboard_finance (symbol, company, price, change_pct, volume)
VALUES ('NVDA', 'NVIDIA Corp.', 878.40, 3.56, '67.2M');

INSERT INTO dashboard_finance (symbol, company, price, change_pct, volume)
VALUES ('TSLA', 'Tesla Inc.', 345.20, -1.23, '89.5M');

-- News
INSERT INTO dashboard_news (title, source, category, url)
VALUES ('AI Agents Are Reshaping Software Development', 'TechCrunch', 'AI',
'https://techcrunch.com/example');

INSERT INTO dashboard_news (title, source, category, url)
VALUES ('Bitcoin Approaches $100K as Institutional Demand Surges', 'CoinDesk', 'Crypto',
'https://coindesk.com/example');

INSERT INTO dashboard_news (title, source, category, url)
VALUES ('Fed Signals Potential Rate Cut in Q2 2026', 'Reuters', 'Finance',
'https://reuters.com/example');

INSERT INTO dashboard_news (title, source, category, url)
VALUES ('Oracle APEX 24.2 Introduces AI-Powered Components', 'Oracle Blog', 'Tech',
'https://blogs.oracle.com/example');

INSERT INTO dashboard_news (title, source, category, url)
VALUES ('NVIDIA Reports Record Quarter Driven by AI Chip Demand', 'Bloomberg', 'Finance',
'https://bloomberg.com/example');

COMMIT;

 

 

Step 3: Create the dashboard page

The agent used the APEX wizard to create a new page:

  1. Navigated to App Builder > Pelon Test App (226181)

  2. Clicked Create Page

  3. Selected Dashboard as the page type

  4. Named it "Open Data Dashboard" (Page 2)

 

 

Step 4: Create regions with the PL/SQL API

Here's where it gets good. APEX's Page Designer is visually complex β€” it has drag & drop, side panels, and component trees. Automating it via browser is possible but fragile. The agent made a smart decision. Use the APEX PL/SQL API directly in SQL Workshop.

Why? Because wwv_flow_api.create_page_plug is deterministic. It doesn't depend on UI coordinates, it doesn't break if Oracle moves a button. It's code. And code is reproducible.

The header region with inline CSS

 

BEGIN

wwv_flow_api.create_page_plug(
p_id => wwv_flow_api.id,
p_flow_id => 226181,
p_page_id => 2,
p_plug_name => 'Dashboard Header',
p_region_template_id => NULL, -- Blank with Attributes
p_plug_source_type => 'NATIVE_STATIC_CONTENT',
p_plug_source => q'[
<style>
.dashboard-header {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
color: white;
padding: 24px 32px;
border-radius: 12px;
margin-bottom: 20px;
}
.dashboard-header h1 {
font-size: 28px;
margin: 0 0 8px 0;
}
.dashboard-header p {
opacity: 0.8;
margin: 0;
font-size: 14px;
}
</style>
<div class="dashboard-header">
<h1>🌐 Open Data Dashboard</h1>
<p>Real-time market data, weather, crypto & news β€” Built by an AI Agent with OpenClaw</p>
</div>
]',
p_plug_display_sequence => 10
);
COMMIT;
END;

 

"Why inline CSS? In APEX, you'd normally put CSS in the page properties (Page > CSS > Inline). But programmatically, that requires using wwv_flow_api.create_page with specific parameters that are hard to modify after the page is created. Embedding the CSS in a Static Content region is a pragmatic hack that works well."

 

SQL report regions
Each data section is a SQL Report type region:

 

-- Key Market Metrics
BEGIN
wwv_flow_api.create_page_plug(
p_id => wwv_flow_api.id,
p_flow_id => 226181,
p_page_id => 2,
p_plug_name => 'Key Market Metrics',
p_plug_source_type => 'NATIVE_SQL_REPORT',
p_plug_source => q'[
SELECT
metric_name AS "Metric",
metric_value AS "Value",
change_pct AS "Change",
category AS "Category",
TO_CHAR(updated_at, 'DD-MON-YYYY HH24:MI') AS "Updated"
FROM dashboard_metrics
ORDER BY category, metric_name
]',
p_plug_display_sequence => 20
);
COMMIT;
END;
/

-- Weather Worldwide
BEGIN
wwv_flow_api.create_page_plug(
p_id => wwv_flow_api.id,
p_flow_id => 226181,
p_page_id => 2,
p_plug_name => 'Weather Worldwide',
p_plug_source_type => 'NATIVE_SQL_REPORT',
p_plug_source => q'[
SELECT
city AS "City",
country AS "Country",
temp_c || 'Β°C' AS "Temperature",
condition AS "Condition",
humidity || '%' AS "Humidity",
wind_kph || ' km/h' AS "Wind"
FROM dashboard_weather
ORDER BY city
]',
p_plug_display_sequence => 30
);
COMMIT;
END;
/

-- Crypto Market
BEGIN
wwv_flow_api.create_page_plug(
p_id => wwv_flow_api.id,
p_flow_id => 226181,
p_page_id => 2,
p_plug_name => 'Crypto Market',
p_plug_source_type => 'NATIVE_SQL_REPORT',
p_plug_source => q'[
SELECT
symbol AS "Symbol",
name AS "Name",
TO_CHAR(price_usd, 'FM$999,999,990.00') AS "Price (USD)",
change_24h || '%' AS "24h Change",
market_cap AS "Market Cap"
FROM dashboard_crypto
ORDER BY price_usd DESC
]',
p_plug_display_sequence => 40
);
COMMIT;
END;
/

-- Stock Market
BEGIN
wwv_flow_api.create_page_plug(
p_id => wwv_flow_api.id,
p_flow_id => 226181,
p_page_id => 2,
p_plug_name => 'Stock Market',
p_plug_source_type => 'NATIVE_SQL_REPORT',
p_plug_source => q'[
SELECT
symbol AS "Symbol",
company AS "Company",
TO_CHAR(price, 'FM$999,990.00') AS "Price",
change_pct || '%' AS "Change",
volume AS "Volume"
FROM dashboard_finance
ORDER BY price DESC
]',
p_plug_display_sequence => 50
);
COMMIT;
END;
/

-- Latest News
BEGIN
wwv_flow_api.create_page_plug(
p_id => wwv_flow_api.id,
p_flow_id => 226181,
p_page_id => 2,
p_plug_name => 'Latest News',
p_plug_source_type => 'NATIVE_SQL_REPORT',
p_plug_source => q'[
SELECT
title AS "Headline",
source AS "Source",
category AS "Category",
url AS "Link",
TO_CHAR(published, 'DD-MON-YYYY HH24:MI') AS "Published"
FROM dashboard_news
ORDER BY published DESC
]',
p_plug_display_sequence => 60
);
COMMIT;
END;
/

 

 

 

Step 5: Make the page public

By default, APEX pages require authentication. To make the dashboard public:

  1. In Page Designer, select page 2

  2. In the page properties, go to Security

  3. Change Authentication to Page Is Public

  4. Save and run

The agent did this through the browser in Page Designer β€” for simple UI configurations, browser automation works fine.


 

 

A note on Region Template IDs

An important technical detail to mention is that when using wwv_flow_api.create_page_plug, the p_region_template_id parameter determines how the region looks. In APEX free tier, template IDs vary between workspaces. If you need a specific template (like "Standard" with borders and a title), you can look them up like this:

 

SELECT template_id, template_name
FROM apex_application_temp_region
WHERE application_id = 226181
ORDER BY template_name;

 

For a dashboard, Blank with Attributes (passing NULL as the template) works well for the header, and the Standard template works for the report regions.

Slack Integration: How I Talk to My Agent

The day-to-day experience looks like this. I have a Slack channel called #openclaw-pelon. I write to the agent there like it's a coworker:

Marco: Pelon, update the crypto data on the dashboard with today's prices

Pelon: On it, give me a sec. I'll pull the current prices and update the dashboard_crypto table...

[The agent opens the browser, navigates to APEX, executes UPDATE statements]

Pelon: Done, all 6 tokens updated. BTC is at $98,150, ETH at $2,720. The dashboard already reflects the changes.

 

 

 

What I love is that I don't have to be specific about how to do things. I tell it what I want, and the agent figures out the how. If it needs to navigate to SQL Workshop, it does. If it needs to Google something first, it does. If it hits an error, it debugs and retries.

Tips for communicating with your agent

  1. Be clear about the expected outcome, not the steps

  2. Trust but verify β€” check the results, especially early on

  3. Give it feedback β€” "that's not what I wanted" is valuable information for the agent's memory

  4. Use the channel for everything β€” the more context it has in the history, the better it works

 

Beyond the Dashboard: What Else Does Pelon Do?

The APEX dashboard was a demo project, but the agent does a lot more day to day:

Kanban App (React + Supabase)

Pelon built a full project management app, Kanban-style:

Frontend: React + Vite + TypeScript

Backend: Supabase (PostgreSQL + Auth + Realtime)

Deploy: Vercel

URL: Coming soon, when my agent completes the security, so you can connect your own agent, it's in his TODOs.

It uses it to track its own tasks and mine. Yes, the agent has its own project management.

 

 

 

Google Calendar

Through the gog CLI, the agent has access to my Google calendars. It sends me Slack reminders 5 minutes before each meeting:

Pelon: πŸ—“οΈ You have a meeting in 5 min: "Weekly Sync with Enbridge" β€” Teams link: [...]

 

Automated cron jobs

The agent manages its own cron jobs:

8:30 am: Morning briefing (weather, today's calendar, to-dos)

Every 5 min: Check for upcoming meetings

Every 4 hours: Check email and notifications

Image generation

Pelon can generate images (avatars, diagrams) using AI models. In fact, its Slack profile picture was self-generated.


 

 

Lessons Learned

After weeks of working with an autonomous agent, here are my takeaways:

What works incredibly well

Repetitive tasks: Updating data, creating tables, and inserting records. The agent doesn't get bored and doesn't make typos

Research: "Research best practices for X and give me a summary" β€” the agent searches, reads, and synthesizes

Scaffolding: Creating the base structure of a project (files, configuration, boilerplate)

Documentation: The agent documents everything it does. It literally writes its own logs

What needs supervision

Architecture decisions: The agent can propose, but you decide

Complex UI/UX: APEX's Page Designer was a challenge. Highly interactive interfaces are hard to automate

Access to MFA-protected systems: Some systems require human intervention to authenticate

Business context: The agent doesn't know that "the client doesn't want that color" unless you tell it

 

The PL/SQL API vs Page Designer decision

This was the most important lesson from the APEX project. The agent initially tried to use Page Designer through the browser β€” clicking components, dragging regions, and configuring properties. It worked for simple things (changing the page title, making the page public), but for creating regions with complex SQL queries, it was fragile.

The solution: use wwv_flow_api.create_page_plug directly in SQL Workshop. It's less visual, but it's code. And code is an AI agent's native language.

Moral of the story: When automating with agents, always look for the programmatic interface. APIs > UI.

 

How to Get Started: Your Checklist

If you want to replicate this setup, here's your list:

Hardware and accounts 

  • Mac mini (or any machine you can leave running 24/7)
  • Dedicated macOS account for the agent
  • Dedicated Google account for the agent
  • Anthropic Max plan ($100-200/month, unlimited access to Claude Opus 4)
  • Slack workspace with a dedicated channel

Software

  • Node.js v25+
  • OpenClaw installed (npm install -g openclaw)
  • Slack App configured with bot token

Agent workspace

  • SOUL.md β€” the agent's identity
  • USER.md β€” info about you
  • AGENTS.md β€” workspace rules
  • MEMORY.md β€” long-term memory (starts empty)
  • TOOLS.md β€” notes about tools and credentials
  • memory/ β€” directory for daily memories

For the APEX project

  • Free account at oracleapex.com
  • Workspace and application created
  • The SQL scripts from this post

Conclusion: The Future Is Already Here (and It Has Its Own Google Account)

A year ago, AI agents were a theoretical concept. Today I have one running on my desk that builds applications, reminds me of meetings, and has a better memory than I do (literally β€” it actually writes everything down).

We're not talking about replacing developers. We're talking about amplifying what a developer can do. I still make the architecture decisions, define the requirements, and review the results. But the execution β€” writing SQL, creating tables, configuring regions, debugging errors β€” the agent does that while I do other things.

The setup isn't perfect. Sometimes the agent gets confused with complex UIs. Sometimes it needs you to explain something twice. Sometimes it does something unexpected, and you have to correct it. But every day it's better than the last, because it learns. Its memory grows, its patterns get refined, and its ability to anticipate what you need improves.

If you're a developer and you're not experimenting with autonomous agents, you're missing out on something big. You don't need a huge budget β€” a Mac mini and a subscription plan are all it takes. What you do need is curiosity and a willingness to experiment.

The project code, SQL scripts, and dashboard are all public. Clone it, modify it, make it your own. And if you want to chat about AI agents, find me on Twitter/X or at the OpenClaw repo.

The future of development isn't without programmers. It's programmers with agents. And the future has already begun.

Liked this post? Share it with someone who's still copy-pasting code from ChatGPT by hand. There's a better way. πŸ˜‰