Porque estudar node.js

Por que estudar Node.js? 🚀

Se você está entrando no mundo do desenvolvimento ou quer evoluir como programador, estudar Node.js pode ser uma das decisões mais estratégicas da sua carreira. Mas por quê? Vamos entender.

1️⃣ JavaScript em todo lugar

Com Node.js você usa JavaScript tanto no front-end quanto no back-end. Isso significa menos troca de linguagem e mais produtividade. Para quem já trabalha com frameworks como React, Vue ou Angular, a curva de aprendizado fica muito menor.

2️⃣ Grande ecossistema (NPM)

Node.js possui um dos maiores ecossistemas do mundo de desenvolvimento: o npm. Existem milhares de pacotes prontos que aceleram o desenvolvimento de APIs, autenticação, automação, testes e muito mais.

3️⃣ Alta performance para aplicações modernas

Node.js utiliza um modelo assíncrono e orientado a eventos, permitindo lidar com muitas requisições simultâneas com excelente desempenho — algo muito útil para APIs, aplicações em tempo real e microserviços.

4️⃣ Muito usado no mercado

Grandes empresas utilizam Node.js em produção, e a demanda por desenvolvedores que dominam essa tecnologia continua crescendo. Estudar Node.js aumenta suas oportunidades de trabalho e projetos.

5️⃣ Perfeito para APIs e aplicações em tempo real

Se você quer criar:

  • APIs REST
  • aplicações com WebSocket
  • chats em tempo real
  • sistemas escaláveis

Node.js é uma das melhores opções.

💡 Conclusão

Estudar Node.js não é apenas aprender uma tecnologia, mas entrar em um ecossistema poderoso do JavaScript moderno. Ele permite construir aplicações rápidas, escaláveis e usadas por milhões de pessoas.

Se você quer se tornar um desenvolvedor mais completo, Node.js é um excelente próximo passo.

💬 Você já usa Node.js ou está pensando em aprender? Compartilha sua experiência!

Fonte: Link

Notion Life Review OS — Log your day to Notion from WhatsApp using AI

This is a submission for the Notion MCP Challenge

What I Built

Notion Life Review OS is a WhatsApp assistant that captures your day and organizes everything in your own Notion workspace — from a single message.

You send something like:

“Worked on the API integration today. Need to present to the client next Thursday. Also figured out why our Redis connection was dropping.”

It extracts a task, a project, a learning, and your mood. Asks you to confirm. Saves everything to the right Notion database. No forms. No clicking. No friction.

The core idea is simple: your day lives in WhatsApp already. You’re already typing there. So why open another tool?

It also works the other way. Ask it anything:

“What tasks are due this week?”
“What did I learn this week?”

And you can manage your Notion schema directly from WhatsApp — even via voice:

“Add a column called Who, select type, to the Tasks table”

The new field is available on the very next message.

One thing I really liked about how this came together: the project and task structure is completely generic. You can use it for work — a project called “API Backend” with tasks like “Deploy to production”. But it works just as well for a grocery list — project “Supermarket”, tasks “milk, eggs, bread”. Or a personal to-do list. The system doesn’t care. It just captures what you tell it and puts it in the right place.

Video Demo

Show me the code

github.com/vicente-r-junior/notion-life-review-os

Full setup instructions in the README.

How I Used Notion MCP

Notion MCP is the backbone of the entire system. Every single interaction with Notion goes through it — no direct API calls anywhere.

Reading schema at startup

When the app boots, it calls API-retrieve-a-database and API-retrieve-a-data-source for each of the 5 databases. The schemas get cached in Redis and injected directly into the GPT-4o system prompt — so the agent knows what fields exist, what types they are, and which ones are required, without any extra calls per message.

Writing data

When the user confirms, the app calls API-post-page for each item — daily log, tasks, projects, learnings. This part is pure deterministic Python, not an LLM. The write step is too important to leave non-deterministic.

Querying data

For questions like “what tasks are due this week?”, the agent uses API-query-data-source with structured filters built from natural language. It resolves dates, applies status filters, and formats the answer for WhatsApp.

Updating schema dynamically

When the user asks to add a column — even via voice — the app calls API-update-a-data-source. The Redis cache refreshes immediately and the system prompt is rebuilt. The new field is available on the next message.

Bulk updates

For things like “set all tasks Who to Vicente”, the app queries first, shows a confirmation with the affected records, then calls API-patch-page for each one.

Architecture

WhatsApp → Evolution API → FastAPI webhook
                               ↓
                     Intent classifier (GPT-4o-mini)
                               ↓
           ┌───────────────────┼──────────────────┐
           ↓                   ↓                  ↓
 Conversational agent     Query agent      Add column flow
      (GPT-4o)             (GPT-4o)        (GPT-4o-mini)
           ↓                   ↓                  ↓
      SAVE_PAYLOAD        Notion MCP         Notion MCP
           ↓               (query)          (update schema)
    User confirms
           ↓
     Notion Writer
     (pure Python)
           ↓
       Notion MCP
      (write pages)

One conversational agent instead of a pipeline.
I started with separate extractor, matcher, and confirmation agents. It was complex and fragile. A single GPT-4o call with Redis conversation history turned out to be simpler, faster, and much easier to debug. The agent holds the full context of the conversation and knows when it has enough information to produce a SAVE_PAYLOAD.

The write step is never an LLM.
The notion_writer is pure Python calling Notion MCP directly. Every property format handled explicitly. Giving an LLM direct write access to your Notion is asking for trouble.

Schema-aware prompts.
The agent knows your exact Notion schema at all times. Custom fields like Who, Priority, or Energy are injected into the system prompt dynamically. If a field is marked required, the agent asks for it before saving — no partial records.

Stack

Layer Technology
Backend Python 3.12 + FastAPI
AI OpenAI GPT-4o + Whisper
Notion interface Notion MCP (mcp/notion Docker image)
WhatsApp bridge Evolution API
Session + cache Redis 7
Infrastructure Docker Compose on Hostinger VPS

Setup

1. Clone and configure

git clone https://github.com/vicente-r-junior/notion-life-review-os.git
cd notion-life-review-os
cp .env.example .env

2. Create 5 Notion databases

Inside a parent page called Life Review OS, create:

  • Daily Logs
  • Tasks
  • Projects
  • Learnings
  • Weekly Reports

Copy each database ID into .env. Connect your Notion integration to the parent page — it propagates to all children automatically.

3. Configure .env

OPENAI_API_KEY=sk-...
NOTION_API_KEY=secret_...
NOTION_DB_DAILY_LOGS=...
NOTION_DB_TASKS=...
NOTION_DB_PROJECTS=...
NOTION_DB_LEARNINGS=...
NOTION_DB_WEEKLY_REPORTS=...
MCP_AUTH_TOKEN=any-random-string
EVOLUTION_API_URL=http://your-evolution-api:8080
EVOLUTION_API_KEY=...
EVOLUTION_INSTANCE=your-instance-name
WHATSAPP_NUMBER=5511999999999
REDIS_URL=redis://app-redis:6379
TIMEZONE=America/Sao_Paulo

4. Start

docker compose up -d

Point your Evolution API webhook to http://your-server:8000/webhook and you’re live.

What I Learned

MCP response parsing trips you up the first time. Every Notion MCP response is SSE-wrapped JSON inside a content array. Once you have the unwrapping pattern it’s trivial — but it’s not obvious when you first hit it.

One agent beats a pipeline. I built the multi-agent version first. Extractor, matcher, confirmation, writer — each doing one thing. It looked clean on paper and was a nightmare in practice. Replacing it with a single conversational GPT-4o call and Redis history was the best decision I made on this project.

The write step should never be an LLM. Flexible conversation on the way in, deterministic code on the way out. That’s the pattern that worked.

Prompt design is the real work. Getting the agent to always include SAVE_PAYLOAD when there’s actionable content, never say “done” without confirming, correctly handle corrections mid-conversation — that’s where most of the iteration went. The code was the easy part.

Redis for everything. Session state, schema cache, idempotency keys, conversation history — all in Redis with TTLs. No separate database needed. Cleanup is automatic.

Arkhein: Command Your Silicon. Own Your Memory.

Sovereign macOS Agent · Local-first, zero-cloud intelligence · Alpha v0.0.4

Most AI tools make a trade you didn’t explicitly agree to. You send a query, it travels to a remote server, gets processed alongside millions of others, and an answer comes back. The model learns. The platform profits. Your data stays theirs.

Arkhein is built on a different premise entirely: what if the intelligence lived on your machine, reported to no one, and cost you nothing beyond the hardware you already own?

What Is Arkhein?

Arkhein is a native macOS application — built with NativePHP on top of Laravel, Vue 3, and TypeScript — that runs a complete AI reasoning pipeline entirely on your local hardware. No API keys. No cloud dependency. No data ever crosses the hardware boundary.

It is described simply as a Sovereign macOS Agent: local-first, zero-cloud intelligence powered by Ollama for local inference and Vektor for vector search. The entire codebase is open source under the MIT License and available on GitHub.

The Architecture

Arkhein is composed of four interlocking systems, each designed to keep intelligence local and the operator in control.

1. The Vantage Hub — Verticalized Knowledge Silos

Rather than dumping all documents into a single shared vector pool, Arkhein organizes knowledge into Sovereign Silos — isolated, physical partitions that follow a strict hierarchy:

Silo (Folder) → Vessel (Document) → Fragment (Chunk)

This structure enables Parent-Aware RAG: before retrieving a single fragment, the agent already understands the document summary and the subfolder depth. The result is 100% topical isolation — your medical research never bleeds into your client contracts, and Project A never contaminates Project B.

You authorize exactly which folders Arkhein can access. Everything else on your filesystem remains untouched.

2. The Mind — Local Inference via Ollama

Inference is handled entirely by Ollama, running locally on your Mac. But Arkhein doesn’t simply prompt a model and relay the output — it runs a Multi-Stage Sovereign Arbiter pipeline: a JSON-based reasoning engine that classifies query intent before triggering any retrieval.

A dedicated Dispatcher module determines what kind of query you’re making — retrieval, synthesis, filesystem command, or creative generation — and routes it accordingly. The agent thinks before it acts.

Two compute profiles let you match the workload to your hardware:

Profile Models Recommended RAM
Efficient Mistral + Nomic Embed 8 GB – 16 GB
Elite Qwen3 Suite 32 GB+

The agent also mirrors your language automatically — write in English, Italian, French, or any other language, and the Archivist responds in kind, without any configuration required.

3. The Memory — Self-Healing SSOT

The memory layer uses a two-component architecture designed for reliability and zero-downtime operation:

  • SQLite serves as the Single Source of Truth. All document chunks, metadata, and hierarchy information live here — inspectable, portable, and entirely under your control.
  • Vektor acts as the binary accelerator layer — a disposable vector index built on top of SQLite. If the index becomes inconsistent (for example, due to a dimensional mismatch after switching models), Arkhein automatically detects the issue, discards the index, and rebuilds it using shadow partitions — without taking the system offline.

The archive remains accessible throughout any rebuild. No data loss, no service interruption.

4. The Hand — Filesystem Control

Arkhein can issue filesystem commands — /create, /move, /organize, /delete — with surgical precision. Every action, however, requires a verified Strategic Plan that the operator explicitly approves before execution.

This Human-in-the-Loop model is a core design principle. The agent proposes; you decide; Arkhein executes. You remain the final authority at every step.

The Sovereign Archivist

Above the individual silos sits the Sovereign Archivist: a centralized module for global RAG and system-wide intelligence. Use it to search across all authorized silos simultaneously, or to analyze the system architecture itself. It provides a high-level summary view of everything Arkhein has indexed, and routes cross-silo queries for maximum relevance.

Getting Started

Prerequisites: macOS (Apple Silicon), Ollama, PHP 8.4, Node 22.

Step 1 — Pull the inference models:

# Efficient Profile (Standard — 8GB–16GB RAM)
ollama pull mistral
ollama pull nomic-embed-text

# Elite Profile (Optional — 32GB+ RAM)
ollama pull qwen3
ollama pull qwen3:8b

Step 2 — Initialize the application:

composer install && npm install
php artisan native:migrate
php artisan native:serve

Step 3 — Configure:

Open Settings, authorize your knowledge silos, select a compute profile, and monitor the System Heartbeat to confirm all services are active.

The Stack

Layer Technology
Desktop Runtime NativePHP
Backend Laravel (PHP 8.4)
Frontend Vue 3 + TypeScript
Local Inference Ollama
Vector Search Vektor
Database SQLite
Build Tooling Vite + Node 22
License MIT

Current Status

Arkhein v0.0.4 Alpha is available now for Apple Silicon Macs. The architecture is stable and the core pipeline is fully operational. As an alpha release, rough edges remain — this is software built in the open, not after the fact.

The alpha .dmg is available for direct download from the official website. The full source is available on GitHub, check it out.

Download & Links

From Auth9 to Agent Orchestrator: how an AI-native development method evolved into a Harness Engineering control plane

I have spent years practicing extreme programming and TDD. So when AI coding tools became good enough to handle a meaningful share of day-to-day work, I adopted them quickly and enthusiastically.

Then I hit a very predictable wall.

I became the bottleneck.

AI could write code quickly. It could write tests quickly too. But the final question, “is this actually correct?”, still landed on me. I had to review the implementation, run the environment, click through flows in the browser, inspect application logs, check database state, and decide whether the output was real or just superficially plausible.

In other words, AI had accelerated generation, but I was still manually carrying too much of the verification burden. The faster the model became, the more manual review and QA work accumulated around me.

That was the moment I started pushing testing even further left, but this time not just in the classic TDD sense. I started pushing the entire validation loop left.

Shifting the validation loop left

I stopped waiting until after implementation to think seriously about testing.

Before writing code, I started requiring AI to produce explicit test plans. After implementation, AI was not allowed to stop at “done”. It had to execute the validation plan: drive the browser, inspect logs, check database state, compare outcomes against expectations, create structured tickets for failures, fix them, and rerun the relevant checks until the results converged.

Over time, this stopped feeling like a set of prompting tricks and started feeling like a method. The method included:

  • test plans before implementation
  • structured docs for QA, security, and UI/UX verification
  • ticket-driven repair loops
  • doc governance to keep the verification layer from rotting
  • reusable Skills that encode repeatable development and validation behavior

At that point I needed a real proving ground.

Why Auth9 mattered

I chose Auth9, a full identity platform, because I wanted something difficult enough to make the method fail if it was weak.

Identity systems are full of dangerous edges: protocol semantics, state transitions, interoperability, security constraints, permission models, and long tails of compatibility work. If a method can help govern that kind of system, it is probably doing something real.

Auth9 was where this approach became concrete. While building it, I kept refining the method itself: how docs should be governed, which checks needed to become standard, how to turn recurring behavior into Skills, and how to keep the ticket/fix/retest loop honest.

As the project evolved through real iterations, I became convinced that this was not just a convenient way to ship features faster. It was becoming a viable way to govern complex software over time.

That was when Agent Orchestrator began.

I did not begin with a plan to build a platform. I began with a method that was proving useful, and I no longer wanted to supervise every step manually. If the method was real, it should be able to keep running after I stepped away from the keyboard. That requirement naturally pulled me toward a control plane.

The mid-March test

By mid-February, I was already using early Orchestrator-style automation inside Auth9. In mid-March, I decided to run a high-risk experiment: I wanted to see whether Orchestrator and this method could actually carry a complex low-level refactor.

I replaced the headless Keycloak setup under Auth9 with a native auth9-oidc engine.

For an identity platform, replacing the underlying OIDC engine is not a cosmetic change. It touches protocol behavior, state flow, interoperability assumptions, and a long list of edge cases that often surface only after the “main” work seems complete.

By then, I was already using the early Orchestrator to help govern the process. It did not magically remove the difficulty, but it did provide a structure around the work: execution flow, task state, logs, tickets, and repeatable validation.

The core replacement landed over three days. OIDC conformance and Keycloak legacy cleanup followed within the same week.

More importantly, the story did not end there. The same method and Orchestrator-assisted workflow helped converge the technical debt that surfaced after the change, and eventually completed the community OIDC Certification tests on the native engine.

That sequence mattered more to me than the initial three-day number. It showed that the method and the tool were not only useful for greenfield development. They could also help govern a high-risk system through long-running, uncomfortable change.

Why the project is called Orchestrator

At the time, the word I cared most about was orchestration.

What I wanted most was a reliable way to orchestrate this method: execute the next step, keep state, record logs, preserve intermediate outputs, stop safely, and resume later. So the project became Agent Orchestrator.

The broader conceptual framing came later.

Later, I found a better name for the category

When OpenAI later used the term Harness Engineering, I immediately recognized the shape of the work. Not because I thought I had coined the idea first, but because the term described something I had already been converging on through practice.

The point was larger than orchestration alone. What mattered was the full harness around the agent: workflow, constraints, observability, recovery, and feedback loops.

That is why I now describe Agent Orchestrator as a Harness Engineering control plane. The project name came first; the clearer positioning came later.

What Agent Orchestrator actually is

It is a local-first control plane for shell-based coding agents. Agents, workflows, and step templates are declared in YAML. A daemon (orchestratord) schedules steps, routes work by capability, keeps task state in SQLite, streams logs, and enforces guardrails such as sandboxing and output redaction. The CLI is machine-parseable so agents can drive it too.

Some design choices matter a lot here:

  • local-first runtime so the control plane stays close to the repository
  • SQLite-backed task state so long-running work remains inspectable
  • machine-readable CLI output so agents can participate directly
  • declarative YAML resources so the workflow logic lives outside one model session
  • support for heterogeneous shell agents so the method does not depend on one vendor

To me, Orchestrator is not another code-generation plugin. It is the control surface that lets this method keep running.

The part I trust most

One reason I trust this framing is that the project has also been used on itself.

Self-bootstrap and self-evolution were important validation paths from early on. If the method is real, it should not only work on downstream projects. It should also survive contact with the control plane itself.

If you are also trying to turn repeated AI-assisted engineering work into something more systematic and more durable, that is exactly the gap I built Orchestrator to address.

You can try it here:

brew install c9r-io/tap/orchestrator
# or
cargo install orchestrator-cli orchestratord
orchestratord --foreground --workers 2 &
orchestrator init
orchestrator apply -f manifest.yaml
orchestrator task create --goal "My first task"

It is open source, still evolving, and I would genuinely like to hear how other people are turning repeated AI-assisted engineering work into something that can survive real software delivery.

HTML Tutorial for Beginners: Build Your First Webpage Today

TL;DR

Most beginners waste hours writing HTML without understanding the one structural rule that holds every webpage together. This guide walks you through the essential tags, why they exist, and how to snap them together like LEGOs — but the trick that makes your page actually work on mobile? That’s buried further down, and most tutorials skip it entirely.

Why Beginners Struggle With HTML (It’s Not What You Think)

Here’s the honest truth: HTML is not hard. But the way it’s usually taught? Absolutely brutal.

Most beginner resources throw 50 tags at you on day one and expect you to memorize them like a dictionary. So you end up copying code you don’t understand, nothing looks right, and you quietly wonder if web development is just not for you.

It is for you. You just needed a better starting point.

The real reason beginners struggle with HTML isn’t the tags — it’s not knowing why the tags exist and how they talk to each other. Once that clicks, everything else clicks with it.

Let’s fix that right now.

What Is HTML, Actually?

HTML stands for HyperText Markup Language. But forget the fancy name. Think of it like this: if a webpage were a house, HTML is the bricks, walls, and rooms. CSS paints the walls and picks the furniture. JavaScript makes the lights switch on and off.

HTML is the structure. That’s it. And structure is always the first thing you build.

Every HTML page is made of tags — little labeled instructions wrapped in angle brackets like <this>. Most tags come in pairs: an opening tag and a closing tag.

<p>This is a paragraph.</p>

The <p> opens it. The </p> closes it. Everything in between is the content. Simple.

The Skeleton Every HTML Page Needs

Before you write a single headline or paragraph, every HTML page starts with this exact skeleton:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My First Page</title>
  </head>
  <body>
    <!-- Your visible content goes here -->
  </body>
</html>

Let’s break down what each piece does:

<!DOCTYPE html>

This single line tells the browser: “Use the modern HTML5 rulebook.” Skip it and the browser guesses — and guesses wrong half the time.

<html lang="en">

Wraps your entire page. The lang="en" part quietly tells search engines and screen readers what language your content is in. It matters more for SEO than most beginners realize.

<head> — The Hidden Control Room

Nothing inside <head> shows up on the page. But it controls everything behind the scenes:

  • <meta charset="UTF-8"> — Makes sure special characters like é, ñ, or even 😄 display correctly
  • <meta name="viewport" ...> — This is the one most beginners miss. Without it, your page looks zoomed out and broken on phones. Three lines of code, and your site becomes mobile-friendly.
  • <title> — The text that shows up on your browser tab and in Google search results

<body> — Where the Real Action Happens

Everything your visitor actually sees lives inside <body>. Headlines, paragraphs, images, links — all of it.

The Tags You’ll Use 90% of the Time

You don’t need to memorize every HTML tag. You need to know the ones that actually get used. Here they are:

Headings — Your Billboard Text

<h1>This is your biggest headline</h1>
<h2>This is a section title</h2>
<h3>This is a subsection</h3>

Headings go from <h1> (largest) to <h6> (smallest). Rule of thumb: use only one <h1> per page. Google pays attention to this.

Paragraphs — Your Text Blocks

<p>This is where you write your content. Each paragraph gets its own tag.</p>

Links — Your Teleporters

<a href="https://drivecoding.com" target="_blank">Visit Drive Coding</a>
  • href = the destination URL
  • target="_blank" = opens in a new tab (very handy)

Images — Your Eye Candy

<img src="photo.jpg" alt="A description of the photo">

Note: <img> is self-closing — no need for a </img>. And always include alt text. It helps visually impaired users and your SEO ranking.

Lists — Your Organized Trays

<!-- Unordered (bullet points) -->
<ul>
  <li>HTML</li>
  <li>CSS</li>
  <li>JavaScript</li>
</ul>

<!-- Ordered (numbered) -->
<ol>
  <li>Learn HTML first</li>
  <li>Then CSS</li>
  <li>Then JavaScript</li>
</ol>

A Mistake 90% of Beginners Make

Most beginners write HTML like a wall of text — no structure, no logic, just tags everywhere. Then they wonder why the page feels random and messy.

The fix is semantic HTML — using tags that describe what the content means, not just how it looks. For example:

<!-- Non-semantic (avoid this) -->
<div>My Blog Post Title</div>

<!-- Semantic (do this instead) -->
<article>
  <h2>My Blog Post Title</h2>
  <p>Content goes here...</p>
</article>

Tags like <header>, <nav>, <main>, <article>, <section>, and <footer> tell browsers and search engines exactly what role each piece of content plays. It’s one of the biggest things that separates beginners from developers who actually get hired.

Key Takeaways

  • Every HTML page needs the full skeleton: DOCTYPE, html, head, and body
  • The viewport meta tag is not optional — skip it and mobile users suffer
  • You only need ~10 tags to build something real
  • Semantic tags aren’t just best practice — they directly affect your SEO
  • The alt attribute on images is a two-for-one: accessibility and search rankings

Want the complete guide with more examples, a hands-on profile card project, and the full breakdown of semantic vs. non-semantic HTML? Read the full post at Drive Coding: https://drivecoding.com/html-tutorial-for-beginners-your-complete-introduction-to-html-basics/

Originally published at https://drivecoding.com/html-tutorial-for-beginners-your-complete-introduction-to-html-basics/

AionUi vs. Traditional Chatbots: Why Your AI Agent Needs Local File Access Now

Stop chatting and start coworking: How AionUi automates your development workflow 24/7. · iOfficeAI/AionUi

The Shift from Chatbot to Coworker
For the past year, we’ve lived in a ‘Copy-Paste’ era of AI. You ask a chatbot for code, it provides a snippet, you copy it, you paste it, you debug it. It’s a tedious, manual loop that keeps the AI at arm’s length from your actual project.

Enter AionUi. This isn’t just another Electron-wrapped chat client; it’s an evolution in how we interact with LLMs. By acting as a ‘Cowork’ platform, AionUi bridges the gap between a passive assistant and an active autonomous agent that lives inside your file system.

AionUi vs. The Field
When we compare AionUi to traditional web-based AI clients (like standard ChatGPT or Claude web interfaces), the difference is stark. Most clients are sandboxed—they exist in a browser tab and can’t touch your machine. AionUi, however, treats your computer as its workspace.

• Full File Access: Unlike web clients, AionUi’s built-in agents can read, write, and execute code directly within your environment.

• Multi-Agent Orchestration: Why rely on one model? AionUi supports Claude Code, Codex, OpenClaw, Qwen Code, and over 12 others, allowing you to swap ‘brains’ based on the task at hand.

• 24/7 Automation: Through its Cron-based scheduling, you can set the agent to perform maintenance tasks while you sleep, something impossible with manual web chats.

Technical Underpinnings: Built for the Developer
Looking at the repository, it’s clear this tool was built by engineers for engineers. The architecture is strictly separated into src/process/, src/renderer/, and src/process/worker/, ensuring that the heavy lifting of agent execution doesn’t hang your UI.

They’ve enforced strict coding standards—using @arco-design/web-react for the UI and UnoCSS for styling—which keeps the codebase clean and performant. The requirement to run bun run lint:fix and bunx tsc –noEmit before commits ensures that even as the project grows, it remains stable. This is a level of discipline rarely seen in rapidly expanding open-source projects.

The Friction Points
No tool is perfect. While AionUi offers massive utility, it requires a higher degree of trust. Giving an AI agent autonomous access to your file system is powerful, but it means you need to be diligent about your API keys and the permissions you grant. Additionally, the learning curve for configuring custom agents is steeper than simply logging into a website.

Is It Time to Switch?
If you find yourself constantly context-switching between your IDE, your terminal, and a browser window to paste code back and forth, AionUi is your solution. It turns the AI from a ‘search engine’ into a ‘team member’.

Stop settling for chatbots. Start building a pipeline. Download AionUi, configure your favorite CLI agent, and see how much time you save when the AI does the grunt work for you.

AionUi isn’t just another chat client; it’s a Cowork platform where AI agents work alongside you on your computer.

AI-Driven Chrome Extension Development with WXT and Chrome DevTools MCP

The Problem

Building a Chrome extension that modifies a third-party web app is a unique challenge. The DOM structure is opaque, class names are minified and change between deployments, and there’s no official API to hook into. Traditional extension development looks like this:

  1. Inspect the DOM manually in DevTools
  2. Write selectors and content scripts
  3. Reload the extension
  4. Check if it works
  5. Repeat

This cycle is slow. I wanted an AI coding agent that could see the actual browser state and verify its own changes — not just generate code blindly.

That’s how I arrived at this stack: WXT for the extension framework, Chrome DevTools MCP for giving the AI agent browser access, and Cursor as the IDE tying it all together.

The Stack

Tool Role
WXT Chrome extension framework (TypeScript, hot reload, Manifest V3)
Chrome DevTools MCP MCP server that exposes Chrome DevTools Protocol to AI agents
Cursor AI-powered IDE with native MCP support

Step 1: WXT with a Fixed CDP Port

WXT is a framework that wraps Chrome extension development with file-based routing, hot reload, and TypeScript support out of the box. The key insight is that WXT’s runner can launch Chrome with custom Chromium args — including --remote-debugging-port.

// wxt.config.ts
import { defineConfig } from 'wxt';

export default defineConfig({
  manifest: {
    name: 'My Extension',
    version: '1.0',
    permissions: ['storage'],
  },
  extensionApi: 'chrome',
  runner: {
    chromiumArgs: [
      '--remote-debugging-port=9222',
      `--user-data-dir=${process.cwd()}/.chrome-debug-profile`,
      '--exclude-switches=enable-automation',
    ],
    startUrls: ['https://example.com'],
  },
});

Three things to note:

  1. --remote-debugging-port=9222 — Exposes the Chrome DevTools Protocol on a fixed port. The MCP server connects here.
  2. --user-data-dir — A dedicated profile directory, separate from your daily Chrome. Login sessions persist across dev restarts. Add this to .gitignore — it contains cookies and session tokens that must not be pushed to a repository.
  3. --exclude-switches=enable-automation — Without this, some sites detect the “automated” browser and block sign-in.

When you run wxt (or npm run dev), WXT launches Chrome with these args, loads your extension, and watches for file changes — all in one command.

Step 2: Chrome DevTools MCP Configuration

MCP (Model Context Protocol) lets AI agents call external tools. Chrome DevTools MCP is an MCP server that wraps the Chrome DevTools Protocol — giving your AI agent the ability to navigate pages, evaluate JavaScript, take screenshots, and inspect the DOM.

Configuration lives in .cursor/mcp.json:

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-devtools-mcp@latest",
        "--browserUrl=http://127.0.0.1:9222"
      ]
    }
  }
}

That’s it. When Cursor starts, it spins up the MCP server, which connects to Chrome on port 9222. The AI agent can now see and interact with your browser.

Step 3: The Dev Script (Optional but Recommended)

A small shell script wrapping the two main workflows keeps things ergonomic:

./dev.sh dev      # WXT dev server + Chrome (hot reload + MCP)
./dev.sh start    # Load built extension (no hot reload, MCP only)
./dev.sh stop     # Kill debug Chrome
./dev.sh status   # Check CDP connection

dev is the primary mode — WXT handles everything and you get hot reload. start is for testing production builds with MCP inspection. The script handles edge cases like port conflicts, PID management, and connection verification via curl http://localhost:9222/json/version.

The Workflow in Practice

1. Start the environment

npm run dev   # or ./dev.sh dev

Chrome opens automatically with the extension loaded. WXT watches for file changes. The MCP server connects to port 9222. Cursor’s AI agent can now see the browser.

2. AI inspects current state

The AI agent evaluates JavaScript in the browser context to understand the current DOM:

// The agent runs this via MCP
evaluate_script({
  function: `() => ({
    injectedStyle: !!document.getElementById('my-extension-styles'),
    buttonCount: document.querySelectorAll('.my-custom-button').length,
    panelVisible: !!document.getElementById('my-panel'),
  })`
})

The agent can verify its own changes without you switching context. It writes code, WXT hot-reloads, and the agent checks if the DOM updated correctly.

3. AI verifies changes through the browser

Here’s the key difference from normal AI-assisted coding. Instead of:

“I’ve added the panel. Please refresh and check if it works.”

The AI does this:

“I’ve added the panel. Let me verify… [evaluates script via MCP] … The #my-panel element exists, has 5 child entries, and is positioned correctly. Rendering looks good.”

Text-based DOM verification is preferred over screenshots — it’s faster, cheaper, and more precise:

// Good: structured verification
evaluate_script(() => {
  const buttons = document.querySelectorAll('.my-button');
  return {
    count: buttons.length,
    firstButton: buttons[0]?.outerHTML.substring(0, 200),
  };
});

// Screenshots only when you need visual layout confirmation
take_screenshot()

Tips and Gotchas

Content Script Isolation

Chrome extension content scripts run in an isolated world. Variables set on window in the content script are invisible to evaluate_script via MCP, because MCP evaluates in the page context.

The workaround: verify through DOM side effects, not global variables.

// Won't work: window globals are in the isolated world
evaluate_script(() => window.myExtensionState) // → undefined

// Works: check the DOM changes the extension made
evaluate_script(() => ({
  styleInjected: !!document.getElementById('my-extension-styles'),
  panelExists: !!document.getElementById('my-panel'),
}))

Selector Strategy for Third-Party UIs

When building extensions for sites you don’t control, selectors break frequently. A fallback chain helps:

const el =
  document.querySelector('[aria-label*="Submit"]') ||
  document.querySelector('[data-test-id="submit"]') ||
  document.querySelector('.submit-btn');

Priority:

  1. ARIA attributes (aria-label, role) — most stable across updates
  2. Semantic attributes (data-test-id) — moderately stable
  3. Class names — last resort, always provide as fallback

You can even build a DOM analyzer shortcut (Ctrl+Shift+D) that exports the page structure in a format the AI agent can consume. When selectors break, press the shortcut, paste the output into Cursor, and the agent updates the fallback selectors.

Async DOM Waiting

SPA elements appear asynchronously. Rather than fragile setTimeout chains, use polling with bounded retries:

let retries = 0;
const interval = setInterval(() => {
  const el = document.querySelector(selector);
  if (el || retries++ > 10) {
    clearInterval(interval);
    if (el) callback(el);
  }
}, 500);

If the element never appears, fail silently — no console spam.

Google Login Gotcha

When Chrome launches with --remote-debugging-port, Google sometimes detects it as an “unsafe browser” and blocks sign-in. The --exclude-switches=enable-automation flag helps, but if it’s not enough:

  1. Launch Chrome with the dedicated profile (without WXT)
  2. Sign in manually
  3. Close Chrome
  4. Now run npm run dev — WXT reuses the same profile with the valid session

The dedicated --user-data-dir persists your login across dev sessions.

--user-data-dir and Security

The dedicated profile serves two purposes:

  • Isolation from your daily Chrome: The dev browser doesn’t touch your bookmarks, extensions, or sessions — and your personal credentials don’t leak into the dev environment.
  • Minimal credentials: Only log into what you need for development. Don’t sign into personal Gmail or other unrelated accounts.

Keep in mind:

  • Always add the profile directory to .gitignore. It contains cookies, session tokens, and LocalStorage.
.chrome-debug-profile/
  • CDP port 9222 is accessible from localhost. --remote-debugging-port binds to 127.0.0.1 by default, but any process on your machine can access all open tabs. Only run it during active development.
  • Don’t use this on shared machines. While CDP is open, anyone on the same machine can control the browser session.

Getting Started

If you want to try this workflow:

1. Create a WXT project

npm create wxt@latest my-extension
cd my-extension

2. Add CDP port to wxt.config.ts

runner: {
  chromiumArgs: [
    '--remote-debugging-port=9222',
    `--user-data-dir=${process.cwd()}/.chrome-debug-profile`,
    '--exclude-switches=enable-automation',
  ],
},

3. Create .cursor/mcp.json

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp@latest", "--browserUrl=http://127.0.0.1:9222"]
    }
  }
}

4. Run

npm run dev

Chrome launches with CDP enabled, Cursor’s agent connects. Your AI agent can now see your browser.

Why This Workflow Matters

The traditional Chrome extension development loop is write → reload → manually check → repeat. With WXT + Chrome DevTools MCP, it becomes write → auto-reload → AI verifies → iterate — and the AI agent can do the first and last steps too.

  • Debugging goes from “read console logs, set breakpoints, manually reproduce” to “AI evaluates scripts in the live browser and reports what’s happening.”
  • Selector maintenance goes from “open DevTools, inspect element, copy selector, paste into code” to “AI reads the DOM and updates fallback selectors.”
  • Feature development goes from “code blind, test manually” to “AI writes code, checks DOM state, fixes issues — all in one turn.”

This doesn’t replace understanding your own extension. But it dramatically shortens the feedback loop, especially for the tedious parts of third-party DOM manipulation.

Alter Queries

In this assignment, I worked on modifying existing tables using ALTER TABLE. This helped me understand how to update constraints without recreating tables.

1.Make email NOT NULL in customers

ALTER TABLE customers ALTER COLUMN email SET NOT NULL;

2.Make username UNIQUE in users

ALTER TABLE users ADD CONSTRAINT unique_username UNIQUE (username);

3.Add CHECK constraint on price > 0 in products

ALTER TABLE products ADD CONSTRAINT price_check CHECK (price > 0);

4.Set default ‘pending’ for status in orders

ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';

5.Add salary column with constraints in employees

ALTER TABLE employees ADD COLUMN salary INT NOT NULL CHECK (salary > 10000);

6.Modify foreign key with CASCADE

ALTER TABLE employees DROP CONSTRAINT employees_department_id_fkey; ALTER TABLE employees ADD CONSTRAINT employees_department_id_fkey FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE CASCADE;

7.Remove CHECK constraint on balance in accounts

ALTER TABLE accounts DROP CONSTRAINT accounts_balance_check;

8.Add composite UNIQUE in payments

ALTER TABLE payments ADD CONSTRAINT unique_user_transaction UNIQUE (user_id, transaction_id);

What I Learned

  • ALTER TABLE helps modify structure without deleting data
  • Constraints can be added, removed, or updated anytime
  • Naming constraints properly makes them easier to manage

API Tooling Didn’t Get Better. We Just Lowered Our Expectations

Executable API workflow in VSCode

It is strange how little we talk about APIs now.

Not because APIs matter less. They matter more than ever. Modern software is held together by APIs: SaaS products, internal platforms, mobile apps, partner integrations, automation workflows, and now AI agents calling tools over HTTP-shaped boundaries all day long.

And yet the API ecosystem feels oddly quiet, almost resigned. As if the problem has already been solved. As if Postman, Swagger, a test runner, some CI glue, and a folder full of half-maintained examples are simply the natural end state.

Even newer waves like GraphQL and gRPC, important as they are, never really restarted the broader API tooling conversation. They shifted some technical boundaries, but the workflow problem remained.

I do not think the problem was solved.

I think we just got used to the friction.

The easiest API problem got dramatically better

For a long time, the most visible API problem was documentation.

Docs were incomplete. Docs drifted. Docs showed idealized examples that did not quite match reality. Swagger and OpenAPI helped a lot, but the workflow was still familiar: read the spec, hit the endpoint, discover the actual behavior, update your mental model, move on.

AI changed this surprisingly fast.

Today, if you have a half-decent spec, some examples, or even just a working endpoint, AI can explain the API, summarize it, generate payloads, compare versions, write a client, and answer questions about the docs faster than most human workflows ever could.

That is real progress. But it also exposed something deeper: documentation used to absorb a lot of our frustration with APIs. Once AI made that part dramatically easier, the unsolved parts of API work became much harder to ignore.

The real problem was never just docs

The harder problem is everything that happens after understanding an API.

How do you explore it, keep the useful parts, turn one-off discovery into repeatable verification, test a real workflow instead of a pile of disconnected requests, move from local use to CI without rewriting everything, and make this whole thing work with AI instead of around it?

That is why workflow matters so much. Workflow determines what knowledge survives, how quickly feedback returns, whether a useful experiment becomes a durable asset or disappears, and whether AI is helping inside a real verification loop or just generating more throwaway code.

Workflow is where API knowledge either compounds or dies.

This is where I think the ecosystem largely failed. We got many partial tools:

  • documentation tools
  • request senders
  • schema generators
  • mock servers
  • test runners
  • SDK generators
  • contract tooling

Some of them are good. Swagger is good. OpenAPI is useful. Design-first was a genuinely strong idea.

But if we are honest, none of that really changed the day-to-day workflow for most teams.

Too much of the category kept reinventing the API client while leaving the workflow itself mostly untouched.

The industry spent years polishing variations of the same request-sending model and calling that progress.

The common reality still looks the same: you explore in one place, document in another, test in another, automate in another, and debug failures somewhere else. The useful knowledge gets lost in the gaps. That is the part the industry quietly normalized.

A small example: someone changes a field name in the backend response. The frontend type is now stale. The API example in the docs is stale too. A saved request still “works” but no longer reflects the real workflow. The test suite fails later in CI, far away from the original change. Nothing about this is rare. It is ordinary API work.

Design-first made sense for the human coordination era

Design-first was not a bad idea. It was a coordination technology for humans.

It made sense in a world where frontend and backend were built by different people, often on different teams, moving at different speeds, and trying to align before implementation drifted too far. In that world, the spec had to carry a lot of weight:

  • team alignment
  • mock generation
  • frontend/backend parallel work
  • review before implementation
  • external documentation

That was a real problem, and design-first was a real answer to it.

But AI changes the coordination model.

Now one developer, with one or more AI agents, can often move across frontend, backend, tests, examples, and docs in a single loop. The coordination cost that used to justify spec-first workflow collapses.

The new default starts to look more like this:

  • AI writes backend code
  • AI writes frontend code
  • AI drafts tests
  • the code gets run
  • the spec is generated or updated only when needed

That does not make contracts unimportant. It means the center of gravity shifts away from spec as the starting point.

AI makes this problem more obvious, not less

A lot of people assume AI reduces the importance of API tooling. I think the opposite is true.

AI is very good at working with code, structured schemas, and explicit contracts. It is much less naturally aligned with fragmented click-through workflows, stale collections, and operational knowledge scattered across tools.

If AI helps you understand an endpoint, draft a request, or even generate a test, that is useful. But if the workflow still breaks the moment you want to keep that work, verify it, rerun it in CI, inspect failures, or reuse it inside a larger flow, then AI is not solving the actual problem. It is just accelerating the first step.

That is also what current AI coding tools still lack in practice. The bottleneck is usually not “more documentation.” It is live execution feedback, structured traces, failing assertions, environment context, and a clean way to turn exploratory code into durable verification.

AI solved a lot of API explanation. It did not solve API workflow. If anything, it made the gap more visible.

That is why testing matters more now, not as endpoint checking after the fact, but as the place where exploration becomes verification, verification stays close to the code, and the same artifact survives local use, CI, debugging, and AI-assisted authoring.

The old center was specification. The new center should be executable workflow.

In the AI era, the source of truth is less likely to be a carefully maintained design document and more likely to be:

  • working code
  • runnable tests
  • traces and real responses
  • generated specs when needed
  • verification that survives across local runs, CI, and debugging

We do not need less contract. We need less ceremony and more executable truth.

That kind of workflow is what I think the ecosystem should be building toward: API exploration stays in code, useful discoveries become runnable checks, AI can help write and refactor them, and the same artifacts survive local runs, debugging, and CI.

That is also the direction I want Glubean to push toward, not as another request sender, but as tooling built around that loop.

Executable API workflow in VSCode

That matters because, despite all the abstraction layers, the real boundary still looks a lot like HTTP: requests, responses, auth, retries, headers, payloads, failures, and state transitions between calls. If that boundary remains central, the workflow around it cannot stay this fragmented forever.

It is time to care about API tooling again

I do not think the conclusion is that we need another Swagger clone. And I do not think AI will make API tooling disappear.

The conclusion is almost the opposite: it is time to take the API ecosystem seriously again.

Not just as documentation, schema, generated code, or a request sender with a nicer UI, but as a workflow problem.

A real API workflow should let you understand an API, explore it, keep the useful parts, turn them into verification, run them in different environments, inspect failures, and make that whole loop work better with AI instead of breaking under it.

That is still missing.

We did not stop talking about APIs because they became perfect. We stopped talking about them because we stopped expecting anything better.

I think that is a mistake.

The reason I am building Glubean is simple: it never felt good enough in the API ecosystem. Not the exploration workflow. Not the testing story. Not the handoff into automation.

So I want to try one more time. Not because I think one new tool will magically fix everything, but because I do not think the community should give up on this problem.

How to Build Access Control Without Passwords, Keys, or Secrets

There is a page on the internet right now that anyone can visit. The URL is public. The server is unprotected. There is no login, no password, no firewall, no encryption standing between the world and what is on it.

And almost nobody on earth can see it.

Not because it is hidden.

Because there is no key to find.

Most security hides a secret. This does not. It asks whether you qualify.

This is condition-based access. Not identity. Not secrets. Conditions.

What “Secure” Has Always Meant

Every security system in history has been built on the same idea: hide something. A password. A private key. A certificate. A secret that, if found, opens the door.

Bitcoin hides a 256-bit private key. The security comes from the fact that guessing it is computationally impossible. A classical computer would take longer than the age of the universe to brute force one. A quantum computer running Shor’s algorithm could theoretically change that, which is why the cryptography community is already building post-quantum replacements.

Every password, every private key, every certificate shares the same vulnerability: there is a secret. And secrets can, in principle, be found.

The Lock With No Key

What if there was no secret to find?

Not a better secret. Not a harder secret. No secret at all.

That is what a wallet-based condition lock is. And it is a different model of access control than anything that has existed before.

Here is how it works. A piece of content, an offer, a web page, an agent conversation, a product listing, sits on the open internet. No encryption. No password. No key. The URL is public. Anyone can knock.

But before anything is revealed, one question is asked: what does your wallet hold, right now, on the blockchain?

The answer comes back as a signed boolean. Pass or fail. If you pass, the content appears. If you fail, it does not. And nothing about what is behind the door is ever exposed.

The Combination That Cannot Be Guessed

A single condition is a welcome mat. Hold this token, get the discount. Simple, elegant, useful for millions of merchants.

But the same primitive that powers a simple fan token discount can power something else entirely.

Ten conditions. Ten independent requirements, each checked live against blockchain state simultaneously.

Hold a specific NFT minted in a limited collection of 500. Hold a minimum USDC balance on Base. Hold governance tokens on Ethereum above a specific threshold. Have a KYC attestation from a recognized issuer on Optimism. Hold a native Bitcoin balance above a specific amount. And five more conditions, each referencing specific contracts, specific token IDs, specific balances, specific attestations.

There is no algorithm, classical or quantum, that computes ownership. The only way to satisfy the conditions is to actually own everything on the list.

And even that is not enough. Ownership is static. The lock checks state. State is time. Time is the lock.

This Is Not Token Gating

Token gating has existed for years. Hold an NFT, get into a Discord. Hold a token, see a page. That model is real and useful. Collab.Land, Tokenproof, Guild.xyz have all built on it.

But it asks the wrong question.

Ownership is a fact about the past. State is a fact about now.

Token gating checks whether your wallet contains something. It runs once, at the gate, and moves on. It does not check your USDC balance. It does not verify a KYC attestation on a different chain. It does not evaluate ten simultaneous conditions across 33 chains and return a cryptographically signed answer.

Wallet auth does not ask whether you once held something. It asks what your wallet holds at this exact block, across every supported chain, against every condition you define, and signs the result. Every time. Not just at onboarding.

That is not an upgrade to token gating.

It is a different question entirely.

The Moving Target

There is no moment where you have already solved the lock.

Someone could know every condition. Could assemble every asset. Could hold every required token across every required chain. And still fail, because their USDC balance dropped a dollar below the threshold this morning. Because a staking position unlocked. Because a credential lapsed.

There is no static secret to steal. No list to compile and satisfy once. Miss by one condition, and the door does not open.

You don’t just need to own it. You need to hold it — right now.

This is not a harder password. It is not a longer key. It is a security primitive that does not use secrets at all. The content is in plain sight. The conditions are the lock. And the conditions are the live state of the blockchain.

From Welcome Mat to Vault

The same API call. The same single script. One line changes the conditions.

That sounds abstract, but it already exists as software. We have built four products on this primitive. Each one is a different point on the same spectrum.

SkyeGate Lite. The welcome mat. A merchant adds a single token condition to their website. Hold the neighborhood token, see the members page. Hold the fan token, unlock the exclusive offer. One condition, instant setup, no technical knowledge required. The page is public. The content behind it is not.

SkyeGate. The company layer. A private portal, an investor room, a restricted content section. Multiple conditions: the equity token, a KYC attestation, a minimum balance, a governance credential, verified across chains. The URL is public. Anyone can visit. Nobody without the exact combination ever sees what is inside. Not because it is hidden. Because the door does not appear for them.

SkyeWoo. The store. Token-gated commerce. A product, a discount, a price tier that only exists for qualified wallets. The storefront is open. The offer surfaces only at checkout, only for the wallet that meets the conditions. Everyone else sees the standard price. Nobody sees what they are missing.

AgentTalk. The agent session. An AI conversation that only opens to a qualified principal. The agent does not respond until the wallet behind it clears. No conversation starts, no session opens, no information is exchanged until the signed attestation confirms the principal holds what is required. The agent is in plain sight. The conversation is not.

All four are built on InsumerAPI. Any developer can access the same primitive directly and build their own version of any of these, or something that has never existed before.

One API call. One signed boolean. The content never moves. The door never appears. Only those who qualify ever know it was there.

Try It

There is a page you can either see or not. The difference is not what you know. It’s what you hold.

SkyeGate · SkyeWoo · AgentTalk

Powered by InsumerAPI. One API call, free to start, 33 chains.

The Insumer Model™ · March 2026
Blockchains made writing permanent. We make reading them verifiable.