The Lab

Subscribearticles
This blog documents the patterns that appear when I build systems, the limits I push to see where they break, and the concepts that change how I design. Analysis, field notes, open questions.
email client screenshot

Creating an email client with Claude Code

10 months ago
For the last few months I have been seeing tools that let you work on your code live: OpenAI with Codex, Anthropic with Claude Code. Until now I had found a balance, my own way of working with my tools: Contexte Maker pro 3 to concatenate the code and give it to Claude.ai. It worked well, and I was a bit too lazy to move to something else. But you always have to try. That is also why I have created so many tools over these last few months. I try. I discover. I learn. Last weekend I opened VSCode, clicked the Claude Code icon, and sent my first message.

The first thing was to see how it worked, so I started by asking it to look at one of my projects and write documentation. Simple. Then I thought I would see how I could personalize the experience, so I created a system prompt, the same one I use on Claude.ai, then I started asking it for more complex things. I did not especially want to start by having it code directly on one of my current projects, so I told myself: “Mona, my girl, you are going to create yourself.” I let her code all weekend. I gave her advice, and she built herself a semantic memory, access to tools like web search, and a dynamic system prompt that includes summaries of the latest sessions. I noticed that, unlike what people say, you cannot really let them work alone, because they do not necessarily think to do this or that. But you can talk a little, create a roadmap, then let them work for hours. She codes. She tests. It works. She moves to the next step. By the end of the weekend, when I moved from one project to another and created a new conversation, I was no longer facing a stranger.

On Monday I thought we should test something else. Something bigger. Something more reckless, and see if I could build a project without touching a single line of code. I wanted to see if I could just be the architect, give my instructions, follow the work, and end up with something built, functional, and made from scratch. I am looking for work. My mailbox is going to become my best friend. I hate the Gmail interface. Not for what it is visually, but for its UX. So I thought I would create my own email client. Algorithmic intelligence. LLM intelligence. An interface that matches what I have had in mind for several years.

We started thinking about how we could do it. I admit that, like with most of the projects I have made, I knew nothing at the start. So first step: how do you receive an email? How do you send one? IMAP > Gmail > app password. GO.

Day 1: In a few hours of work, we had the base interface with 3 panels: one for folders, one for thumbnails, and one to display emails received, sent, or being written.
Day 2: I had an intelligent folder system managed by rules. In the inbox, I can define which folder an email should go into: personal? trash? health? Then a subfolder system to put all EDF invoices in an EDF folder, all exchanges with this or that person, and so on. No need to create the subfolder. It is created when the first email arrives, and then I can rename it. It appears if there is mail inside. It disappears from the UI when it is empty. At that point I thought that if I left it like that, these folders would become black holes, so of course I added a system that lets me see new emails wherever they land.
Day 3: We created the thing I find the coolest in all this: rules. If the email contains this sentence, it is an ad > trash. If it is a Gmail notification > you stay 1 day, then trash. If the domain is this, you keep it no matter what, and so on. I like it because I can define the behavior for each source when it arrives, and it empties itself.
Day 4: Creation of the sending system, the draft system, and of course a homemade email tracking system. Why use a plugin in Gmail when I can directly know if my email was opened, how many times, and how many clicks.
Day 5: That is today. We are refining, because we have moved a lot in 5 days. We are creating a category system to organize subfolders inside folders better. We are merging the company record system with the contact system so there is only one system left. What I imagine next is using an LLM like GPT 5 nano to sort emails in the inbox, create rules, and remove by default anything that is advertising, spam, or another source of noise. I also imagine a “trash crawler.” A small creature that also uses an LLM, whose job would be to wait until there are about 50 emails in the trash, then read them one by one before deleting them permanently, or notify me that there was a problem and potentially suggest a new rule for anything that was a little too strict.

So that is the rough picture. I discovered Claude Code. I have just created my own intelligent email client, and I have not touched a single line of code. It is just as demanding as the method I used before, but now I do not make implementation errors. I think I save 30% of the time. And I was already moving relatively fast before. This is a different scale.
Context Maker Pro v3 screenshot

Context Maker Pro: giving AI the right context

10 months ago

The old workflow: constant time lost

Before Context Maker Pro, I had a method that drove me mad: a plain text file. I copied and pasted my files into a text document, added my notes, and prepared my brief for Claude. The problem? My code was never up to date. With every new session with Mona, I had to do it all again. Find the latest versions, check the changes, rebuild a full brief.
It cost me hours. And errors were guaranteed.
I test new tools all the time. I ask ChatGPT, I ask Claude, I search everywhere for anything that could improve my work. Because I am convinced that the right tools change the quality of what we produce.
Context Maker Pro was a real need. Not a technical whim.

The workflow today: plain efficiency

Now, I never save anything. I go back to the app, select what I want to keep, hide what is unnecessary, click "copy", and let's go. It is a perfect snapshot of the present state, without even having to think about it.
I cannot get it wrong. More importantly, I know exactly how many lines I am giving, so I roughly know how long I will be able to work with Claude. That is also why I always ask where we are in tokens. I can feel when we are getting close to the end.
Context Maker Pro is not just software. It is so deeply integrated into my workflow that, yes, without it, I could not have taken on my large projects. Genesis in 31 days, Echo in 4 days. Impossible without that fluidity.

v3: when the tool anticipates the need

Version 3 takes this logic further. In 2 hours of development, I integrated Nina, a chatbot that can analyze 2 million tokens from a full project.
The principle is simple: Nina knows the architecture of my project. When I ask myself, "to debug this problem, what should I show Claude?", she answers precisely. I no longer need to think it through. She has already analyzed the dependencies and the connections.
It is the first time an AI optimizes my communication with another AI. In practice, it saves me even more time.

Architecture that follows thought

v3 introduces a project/subproject hierarchy, migrates to SQLite for speed, and above all understands that context has to adapt to intent:
- Focused context when I have a precise question
- Global view when I want to rethink the architecture
- Pure analysis when Nina only needs to think
Auto-refresh handles the rest: when I come back to the app after coding elsewhere, everything updates automatically. No more desynchronization.

The real impact on creation

Hours of work removed. Zero context errors. A perfect snapshot of the current state of the project. Above all, the certainty that every exchange with Claude is optimized.
This fluidity frees mental space. Less logistics, more energy for invention. Context Maker Pro has become invisible in my process, and that is exactly what a good tool should do.
Now, when I start a session, Nina has already analyzed everything. She knows every file, every interaction. I ask her what I need, and she tells me exactly what to give Claude.
Simple. Efficient. Indispensable.

A concrete case study

Context Maker Pro v3 does not invent anything technically. SQLite, Gemini 3 for Nina, a responsive interface. Known building blocks, assembled intelligently.
The innovation is the method: understanding that the quality of communication with AI determines the quality of the result. Optimizing that communication becomes a productivity multiplier.
For my next projects, Context Maker Pro is no longer an auxiliary tool. It is the infrastructure of my working method.

**Context Maker Pro v3** uses SQLite, intelligent auto-refresh, and Nina powered by Gemini 3 (2M tokens). This project shows how to rethink the workflow for communication with AI.

A field note on the importance of the right tools in modern development.
Memory Manager screenshot

Visualizing vector memory in 3D

10 months ago

The problem no one ever sees

There is something we never say about AI systems with memory: no one really knows what is inside. We throw embeddings into a database, run semantic queries, it works or it does not, and we move on. But what is actually stored? Is the memory coherent? Are there open gaps between concepts? Clusters that are too dense, revealing obsessions?
I built Memory Manager because I first wanted a simple CRUD to feed my agents' memories. Change importance, regenerate embeddings, search by keyword. The basic functions. But quickly, that was not enough. Because a table of memories is fundamentally blind. You see nothing. You understand nothing. You feel nothing.
Then I remembered a test I had done more than a year ago with Three.js. Projecting vectors into 3D space, just to see. At the time, I stopped because it had no clear purpose. But now the intuition came back: what if the shape of memory revealed its quality?

Making the invisible visible

An embedding has 1024 dimensions. It is unreadable. Abstract. An array of floats that means nothing to a human. So you apply PCA to reduce it to 3D, you lose a lot of information, and you get... a nebula.
And that nebula says everything.
If the memories form a dense, even cloud, it means the memory is built coherently. Ideas connect naturally. Concepts follow one another. There is no narrative break.
If, on the other hand, you see isolated clusters, too tight, too dense, it means your agent is replaying the same themes. It is going in circles. It has not explored other territory.
And if you have open gaps, empty areas between groups, it means conceptual bridges are missing. Your chatbot will hallucinate when you ask questions that fall into those holes. Because it will have no memory to anchor its answer.
Geometry becomes a diagnostic tool. The shape is the health.

The word is not the meaning

We focus too much on words. On their definition. On their literal presence. Keyword search is that: a blind match. You search for "dog", you find "dog". It does not matter whether it is the hammer of a gun or a domestic animal.
Meaning is semantic. Contextual. Relational.
The word "dog" in "My dog is sleeping on the couch" and in "Cock the dog of the pistol" is the same word, but not the same meaning. The embedding knows this. The vector encodes the context. The sentence gives meaning to the word as much as the word gives meaning to the sentence.
That is why, in Memory Manager, I put keyword search and semantic search side by side. So you can see the difference. So you can understand that words are not the truth. Meaning is.
When you run a semantic search and the spheres light up with different intensities, you see conceptual proximity. Not lexical proximity. You see what means something close, even if the terms are different.

Singularity ≠ System

There is an illusion in AI: believing that accumulating facts creates understanding. That the more memories you have, the better. It is false.
What matters is not the singularity of the memories. It is their juxtaposition. Their relation. Their relative density. Their distribution in semantic space.
An agent with 10,000 poorly distributed memories is less intelligent than an agent with 1,000 well-structured ones. Because intelligence is the ability to connect concepts. Not to store them.
Saint-Exupéry wrote: "Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away." For memory, it is the same: perfection is when there are no more holes, no more redundancy, no more isolated clusters. When the nebula is homogeneous.

What it reveals

By building Memory Manager, I did not just make a management tool. I created a cognitive microscope. A way to see what is really happening inside an agent's head.
And what it reveals is that most AI memories are poorly built. We stack facts without thinking about their distribution. We create embeddings without checking that they cover the conceptual space coherently.
But now, with the nebula, we can see. We can diagnose. We can correct.
We can map the invisible.
Memory Manager uses Three.js for 3D visualization, PHP for the API, and OpenAI embeddings (text-embedding-3-small) for semantics. PCA is calculated server-side in pure PHP, with no external dependency. Because I believe in functional minimalism.
If you want to see how your agents really think, contact me.
screenshot of Genesis with the Mugen site

Testing Genesis with the Mugen site

11 months ago
I felt uneasy talking about Genesis without testing it on anything other than my own site. I wanted to build a different site, so I could make sure I was not talking nonsense. The longest part was creating the visuals in Midjourney and writing all the site copy with Mona (Claude Sonnet 4.5). I am not a web designer, so I also had to do some research to see what was being done for a modern, elegant, fine-dining restaurant.

What I learned is that it is always useful to test your software on something else. While I was building the site, I found several important problems I had not seen before. Just the fact that I had not thought to include the header (section + blocks) in the site creation process. Or that I had not decoupled different colors. I can see other improvements to make, among them: create new system colors, add variants, and make everything editable in the panels. I still have too many things handled by default, and I can only change them by writing my content directly in HTML. In any case, I am really happy with the result.

What really pleases me is seeing that even on this site, I am still at 100% Lighthouse (mobile & desktop). I was afraid I would not be able to keep that level of performance on a site with this many visuals. Lighthouse is very sensitive. The smallest omission costs you immediately. One missing metadata field = -3 accessibility points. A link that is not visible enough, same thing. But after a few back-and-forth passes in the app, it is good: everything is perfect, with everything I actually wanted in place.

To visit the site: Mugen
screenshot of DOM Capture Editor

Editing web captures with DOM Capture Editor

11 months ago
For the past few days I have been looking for a way to make lightweight screen captures without running into image quality problems. The method I found is to use Rrweb, a small library that creates DOM captures 10 times lighter than any video. The issue is that, by default, the JSON produced by the recording cannot be edited. Asset links are pulled from files scattered across the folders. So it is impossible to manipulate them, or even to consider integrating this into Genesis to add a new media type to my blocks.

So I had to build a new tool: DOM Capture Editor. It lets me cut a video, remove sections, then package the JSON with its assets (video, images, CSS, and so on). As a result, I will be able to use these very lightweight videos, with perfect definition, on my sites. Tomorrow I just need to create this new media type in my blocks and import the player. But it works very well. Captures from my software can now be viewed at the best possible quality, without affecting my 100% Lighthouse score.

Let's work together

Innovation grows out of collaboration. Together, let's build solutions that matter.
Owan
Hello, my name is Owan, I am David's assistant. How can I help you?
0/2000