DEV Community

Darlington Mbawike
Darlington Mbawike

Posted on

I Built a Personal AI Assistant with OpenClaw

OpenClaw Challenge Submission 🦞

I Built a Personal AI Assistant with OpenClaw — Architecture, Code, and What Actually Works

Introduction

Most conversations about personal AI focus on capability:

  • smarter models
  • better reasoning
  • human-like conversations

But after building a working system with OpenClaw, I realized something different:

Personal AI isn’t about sounding intelligent — it’s about being useful under real-life conditions.

This post walks through:

  • The architecture I built
  • Real code examples
  • What worked (and what failed)
  • Practical lessons for building your own

System Overview

I designed a minimal but extensible system with 4 core layers:

[ Input Layer ] → [ Processing Layer ] → [ Memory Layer ] → [ Action Layer ]
Enter fullscreen mode Exit fullscreen mode

1. Input Layer

Handles messy, real-world input:

  • text notes
  • reminders
  • unstructured thoughts

2. Processing Layer

  • extracts intent
  • classifies tasks
  • assigns priority

3. Memory Layer

  • stores tasks
  • tracks history
  • enables context

4. Action Layer

  • reminders
  • summaries
  • nudges

⚙️ Core Implementation

🧩 1. Task Extraction Engine

The first challenge: turning messy input into structured tasks.

import re
from datetime import datetime

def extract_tasks(user_input):
    tasks = []

    patterns = [
        r"(buy|call|send|finish|complete)\s(.+)",
        r"remember to\s(.+)",
        r"don't forget to\s(.+)"
    ]

    for pattern in patterns:
        matches = re.findall(pattern, user_input.lower())
        for match in matches:
            task = " ".join(match) if isinstance(match, tuple) else match
            tasks.append({
                "task": task,
                "created_at": datetime.now(),
                "priority": "medium",
                "status": "pending"
            })

    return tasks
Enter fullscreen mode Exit fullscreen mode

👉 This simple parser worked surprisingly well for real-life inputs.


🧠 2. Priority Scoring System

Instead of “AI magic,” I used a rule-based scoring system:

def prioritize_task(task):
    score = 0

    urgent_keywords = ["urgent", "asap", "now", "today"]
    social_keywords = ["call", "reply", "message"]

    for word in urgent_keywords:
        if word in task["task"]:
            score += 3

    for word in social_keywords:
        if word in task["task"]:
            score += 2

    # Time-based boost
    age = (datetime.now() - task["created_at"]).seconds / 3600
    if age > 24:
        score += 2

    if score >= 5:
        return "high"
    elif score >= 3:
        return "medium"
    return "low"
Enter fullscreen mode Exit fullscreen mode

👉 Insight:
Simple heuristics outperformed complex logic for everyday use.


🗂️ 3. Memory Layer (Lightweight Storage)

I used a simple in-memory structure (can be replaced with DB):

class Memory:
    def __init__(self):
        self.tasks = []

    def add_tasks(self, new_tasks):
        for task in new_tasks:
            task["priority"] = prioritize_task(task)
            self.tasks.append(task)

    def get_pending(self):
        return [t for t in self.tasks if t["status"] == "pending"]

    def get_overdue(self):
        return [
            t for t in self.tasks 
            if (datetime.now() - t["created_at"]).seconds > 86400
        ]
Enter fullscreen mode Exit fullscreen mode

🔔 4. Action Engine (Reminders & Nudges)

def generate_nudges(memory):
    nudges = []

    overdue = memory.get_overdue()

    for task in overdue:
        nudges.append(f"You’ve been postponing: {task['task']}")

    high_priority = [
        t for t in memory.get_pending() 
        if t["priority"] == "high"
    ]

    for task in high_priority:
        nudges.append(f"Important: {task['task']}")

    return nudges
Enter fullscreen mode Exit fullscreen mode

🔄 5. Putting It Together

def run_agent(user_input, memory):
    tasks = extract_tasks(user_input)
    memory.add_tasks(tasks)

    nudges = generate_nudges(memory)

    return {
        "tasks_added": tasks,
        "nudges": nudges
    }
Enter fullscreen mode Exit fullscreen mode

🧪 Example Interaction

Input:

"Don't forget to call John and finish the report today"
Enter fullscreen mode Exit fullscreen mode

Output:

Tasks:
- call john (high priority)
- finish the report today (high priority)

Nudges:
- Important: call john
- Important: finish the report today
Enter fullscreen mode Exit fullscreen mode

🔍 What Actually Worked

✅ 1. Simplicity scales better than complexity

The system became more reliable when I:

  • reduced dependencies
  • simplified logic
  • focused on core functionality

✅ 2. Messy input is the real challenge

Handling:

  • incomplete thoughts
  • vague reminders
  • inconsistent language

…was more valuable than improving model intelligence.


✅ 3. Prioritization is everything

Users don’t need more information.

They need:

clarity on what matters now


⚠️ What Didn’t Work

❌ Over-engineering the system

Adding:

  • too many integrations
  • advanced NLP pipelines
  • complex routing

…reduced usability.


❌ Fully autonomous behavior

The system worked best when:

  • it suggested
  • not decided

🚀 Extending This System with OpenClaw

Here’s where OpenClaw becomes powerful:

🔗 Skill-based extensions

  • Email parsing skill
  • Calendar integration
  • Voice note processing

🔄 Composability

Each module can become a reusable skill:

Task Parser → Priority Engine → Notification Skill
Enter fullscreen mode Exit fullscreen mode

💡 Key Insight

After everything, one thing became clear:

The best personal AI is not the smartest system — it’s the most consistent one.


🏁 Final Thoughts

This wasn’t a massive AI system.

It didn’t:

  • write essays
  • simulate emotions
  • replace human thinking

But it did something more important:

It worked.

It handled real-life chaos:

  • forgotten tasks
  • delayed responses
  • mental overload

And that’s where personal AI becomes meaningful.


📌 If You’re Building with OpenClaw

Start here:

  • Capture messy input
  • Build simple logic
  • Add memory
  • Layer intelligence gradually

Don’t chase perfection.

Build something that helps — even a little.

Because in real life, that’s more than enough.

Top comments (0)