← Back to main site Personal AI projects

Things I've built myself, on my own time, with my own hands.

I don't think you can credibly write AI policy for an enterprise if you've never shipped anything with the tools yourself. These are the projects that keep me honest — real systems, with real users, that either work or don't. Each one taught me something I've since carried back into how we govern and deploy AI at work.

Project 01

AI-Powered Calorie & Nutrition Tracker

ChatGPT + n8n + Google Sheets — an evolving agentic application

I wanted to explore one question: could conversational AI replace most of the traditional user interface of a calorie-tracking application? Every food-tracking app makes you search a database, pick a food, estimate a serving, navigate screens and record a meal. I wanted to take a picture and let the AI handle the rest.

TypePersonal AI / agentic automation
StatusVersion 2 — operational
RoleSole architect and builder
StackCustom GPT · Multimodal vision · GPT Actions · n8n · REST · Webhooks · Google Sheets

The experience

The design requirement was frictionless mobile use. I built a custom Calorie Tracker GPT and pinned it on my phone. A typical interaction is:

Take food photo → send → AI identifies the food → estimates nutrition → records each item.

From there the same interface handles everything else conversationally:

  • "How am I doing today?"  /  "How many calories do I have left?"
  • "Delete the protein shake I just logged."
  • "How did I do over the last seven days?"
  • "Show me a chart of my calories and protein this week."

The spreadsheet is deliberately not the interface. It's the data layer. ChatGPT is how I interact with that data.

Architecture

The system separates the conversational experience, the integration logic, and the persistent store — and data moves in both directions, so the same interface can both perform transactions and reason over history.

User — photo or natural languageMobile, one action
Custom GPT — Calorie TrackerVision, estimation, intent resolution, analysis
GPT Actions — structured API callsThe model's authorized operations
n8n webhooks & workflowsDeterministic integration and orchestration
Google SheetsGranular records with unique IDs
Version 1

Establishing the core architecture

Food recognition and nutrition estimation

The GPT accepts a photograph or a natural-language description. For photos it identifies likely foods, estimates portions, estimates calories/protein/carbs/fat, distinguishes estimates from known values, and converts the result into structured data for the backend.

When real nutrition information exists — a package, a label, a restaurant, or something I provide — those values take priority over AI estimates. The goal was never to pretend visual estimation is precise. It was to make reasonable estimates and handle the uncertainty honestly.

Persistent logging and retrieval

  • logFood — the GPT posts structured JSON (date, time, description, calories, protein, carbs, fat, notes) to an n8n production webhook, which maps the fields into Google Sheets. This separates conversational memory from the system of record.
  • getFoodByDate — rather than relying on what the model remembers, the GPT retrieves the actual stored records for a date, totals them, compares against targets, and gives a short assessment.

Personalized targets

MetricDaily target
Calories1,900
Protein150 g
Carbohydrates≤ 150 g
Fat~70 g

Calories and protein are the primary objectives; carbs and fat provide guidance. That lets the GPT give contextual advice instead of just displaying numbers:

"You're at 1,350 calories and 112g of protein. You have about 550 calories remaining and need roughly 38g more protein, so a lean high-protein dinner would fit well."
Version 2

Moving toward an agentic application

After living with Version 1, I expanded the system past logging and retrieval into record-level actions, finer-grained data, historical analysis and visualization.

Unique Entry IDs

Every record now gets an automatically generated unique Entry ID from n8n. This turned out to be the most important architectural change in Version 2.

Without a unique identifier, an AI assistant can name something conversationally — "the protein shake I had this afternoon" — but the backend has no unambiguous way to know which row that is. Entry IDs are the bridge between natural-language intent and deterministic backend operations.

Granular logging

Version 1 stored a whole meal as one record. Version 2 stores identifiable foods individually — chicken, cauliflower rice and a protein shake become three records, each with its own Entry ID. The user never manages those records; the GPT still presents them conversationally as one meal.

Granular backend → simple conversational frontend.

The extra granularity makes individual items deletable and makes real analysis possible later. Composite dishes that can't reasonably be separated — chili, soup, casseroles — are still stored as one record.

Conversational delete — designed to be safe

Version 2 added a deleteFoodEntry workflow and action. Deletion is deliberately multi-step. When I say "delete the protein shake I just had," the GPT does not guess a row:

  1. Retrieve that day's records
  2. Identify the matching food
  3. Obtain its unique Entry ID
  4. Pass that Entry ID to the delete workflow
  5. n8n locates the corresponding row
  6. The specific record is deleted
  7. The GPT confirms only after the action actually succeeded

If more than one record could match, it asks for clarification rather than taking an ambiguous destructive action. Technically a small feature. Practically, the clearest lesson in the project about safe agentic design.

Action guardrails

Once the model could perform transactions, the instruction set had to cover authority, not just tone. The system is instructed to:

  • Never log the same food twice because it's still being discussed
  • Never guess an Entry ID
  • Always retrieve records before performing a deletion
  • Ask for clarification when a destructive action is ambiguous
  • Never claim an operation succeeded unless the backend confirmed it
  • Prefer user-provided nutrition data over AI estimates, and label which is which
  • Avoid unnecessary questions when a reasonable estimate is available
  • Treat missing historical data as missing — never as zero consumption

That list is the real distinction between chatbot prompting and agentic system design. Once AI can act, the instructions have to define what it is authorized to do, under what conditions, and how it behaves when it isn't sure.

Multi-day analysis

The retrieval API works by individual date, so for multi-day questions the GPT retrieves each date and combines the results. That supports "analyze my nutrition for the last seven days" — daily and average calories and protein, carbs and fat, days meeting targets, highest and lowest days, and general trend.

One data-quality rule matters more than the rest: a date with no records is missing data, not zero calories. Otherwise incomplete logging quietly improves your averages, and the system starts lying to you.

AI-generated charts

After retrieving the real records, the GPT runs its own data analysis and generates visualizations — daily calories against the 1,900 target, daily protein against the 150g target. That moves the application from a transactional logger to a lightweight analytics interface, with one natural-language surface responsible for the whole chain:

Capture → transaction → retrieval → calculation → analysis → visualization.

What I took from it

Conversational AI can be the application interfaceThe spreadsheet exists. The workflows exist. The APIs exist. I interact with none of them directly — I tell the AI what I want, and it abstracts several backend systems while they keep structured, persistent data.
Persistent data changes what an assistant can doWithout an external store, the assistant depends on conversation context. With one, it retrieves authoritative records and reasons over them — much closer to a traditional application, with natural language replacing most of the UI.
Granular data enables better agentic actionsUnique Entry IDs and per-item records looked like minor database decisions. They became essential the moment the AI needed to act against a specific record. Good AI experiences still rest on good data architecture.
Destructive actions need their own trust modelReading and deleting should not carry identical permissions. Delete forced the pattern: retrieve → identify → validate → act → confirm — rather than jumping from conversational intent straight to a destructive operation.
AI and deterministic automation are complementsThe model handles what benefits from reasoning: images, intent, portions, trends, explanation. n8n and Sheets handle what must be deterministic: endpoints, execution, mapping, storage, lookup, deletion. Most useful agentic systems aren't about asking AI to do everything — they're about pairing probabilistic reasoning with deterministic systems and controls.

What Version 2 does today

Food recognition from photographsNatural-language logging Nutrition-label interpretationAI portion estimation Calories, protein, carbs & fatPer-item component logging Unique Entry IDsPersistent Google Sheets storage Daily history retrievalDaily totals vs. goals Safe deletion of individual recordsDuplicate protection Multi-day & weekly analysisAverages & trends Missing-data handlingCalorie & protein charts Contextual recommendationsMobile-first conversational operation

Where it goes next

I stopped development after Version 2 on purpose — to actually use the system and find out which capabilities earn their complexity before adding more. That restraint is itself the lesson: the failure mode in personal AI projects isn't building too little, it's building features nobody, including you, turns out to need.

Project 02

AI-900 Practice Exam Platform

A full-stack certification prep SaaS, built with Google Antigravity

Microsoft's AI-900 (Azure AI Fundamentals) is a certification worth having on a team that's deploying Azure AI in production. Good practice exams are either expensive or bad. So I built one — not a prompt, not a chatbot, but an actual multi-user web application with accounts, a question bank, and a database behind it.

TypePersonal SaaS build
StatusVersion 1 built — backend paused
RoleSole architect and builder
StackGoogle Antigravity · Web front end · Hosted database · User authentication

What it is

A web application where a user creates an account, logs in, and takes practice tests aligned to the Microsoft AI-900 exam objectives. Every answer is written to a backend database against that user's account, so attempts and progress persist across sessions rather than evaporating when the tab closes.

Why it's the interesting one

The calorie tracker demonstrates orchestration. This one demonstrates that I can stand up the whole shape of a product: authentication, a persistent multi-user data model, state that survives a session, a front end someone who isn't me can use, and a deployment that runs without my laptop open.

It was built using Google Antigravity — an agentic development environment — which made it a useful experiment in its own right. Building a full-stack application primarily by directing an agent is a genuinely different discipline from writing the code yourself, and it surfaced exactly the questions I now ask my own development teams about AI-assisted coding: where does review happen, what does the agent get wrong quietly, and what still requires a human to hold the architecture in their head.

Currently offline. The platform runs on a free-tier database, so the backend is paused rather than left running. Happy to walk through the application, the data model and the build process directly — or to stand it back up for a demo on request.
Project 03

Luxury Real Estate Lead Engine

lilyfuluxuryhomes.com — a complete conversion site for a Las Vegas realtor

A working lead-generation site for a luxury real estate practice, designed and built with Claude and ChatGPT — the positioning, the conversion copy, the layout, and the automation that runs underneath it. Unlike the other projects here, this one exists to produce business results for someone else, and it does.

TypeProduction marketing system
StatusLive
RoleStrategy, build and automation
StackClaude · ChatGPT · Calendly · Google Workspace · MLS listings

What it does

  • Qualified lead capture — the form asks for selling timeline, not just contact details, so leads arrive pre-sorted by intent rather than as an undifferentiated pile
  • Automated routing — submissions trigger email to the agent with the context needed to respond intelligently, instead of a bare notification
  • Direct booking — Calendly integration lets a prospect book a 30-minute consultation without a single phone call
  • Connected tooling — wired into Google Workspace and live MLS listings so the site stays current without manual upkeep
  • Conversion-first structure — a free selling guide and complimentary valuation as the entry offers, with social proof and a clear value proposition above the fold

Why it belongs in a technology portfolio

Because the interesting part isn't the website. It's that one person, using AI tools deliberately, produced a complete marketing system — positioning, copy, design, integrations and automation — that would traditionally require a small agency and a meaningful budget. That's the productivity shift enterprises are trying to understand, demonstrated at small scale where I could see every part of it.

Visit the site →
Project 04

AI Tech Toolkit

aitechtoolkit.com — an AI-automated publication for technology leaders

A blog covering AI tooling for technology leaders, running on an agentic content pipeline I designed, deployed and operate myself. It functions as a publication and, more usefully, as a live testbed for the agent patterns I'm evaluating for enterprise use.

TypeAgentic content pipeline
StatusLive and publishing
RoleSole architect and operator
StackAgentic workflows · WordPress · Self-hosted

What it is

  • Automated research, drafting, publishing and distribution, end to end
  • Self-hosted and self-maintained — I own every layer, including the parts that break
  • A practical proving ground for agent reliability, quality control and human review checkpoints

Running an automated pipeline continuously is a different education from building a demo. Things degrade, sources go stale, output quality drifts, and you learn quickly which parts of an agentic system need a human gate and which genuinely don't.

Visit the site →
Contact

Want to talk through any of these?

Happy to go deeper on the architecture, the failure modes, or what any of it implies for doing this at enterprise scale.