<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged personal-ai</title>
<link>https://coderlegion.com/tag/personal-ai</link>
<description>Powered by Question2Answer</description>
<item>
<title>I Built My Own Personal AI Assistant — Meet IRIS</title>
<link>https://coderlegion.com/30075/i-built-my-own-personal-ai-assistant-meet-iris</link>
<description>&lt;h2 id=&quot;i-built-my-own-personal-ai-assistant-meet-iris&quot;&gt;I Built My Own Personal AI Assistant — Meet IRIS&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;I've always wanted to build my own personal assistant.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not just another chatbot that answers questions, but something that could actually &lt;strong&gt;live on my computer&lt;/strong&gt; and help me get things done.&lt;/p&gt;
&lt;p&gt;So I started building &lt;strong&gt;IRIS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What started as an idea slowly turned into a real desktop AI assistant running locally on my Mac.&lt;/p&gt;
&lt;p&gt;IRIS can now chat with me, use voice, work with files, search the web, remember information, understand screenshots, control applications, plan tasks, and interact with my computer.&lt;/p&gt;
&lt;p&gt;And honestly, getting it to this point wasn't exactly straightforward.&lt;/p&gt;
&lt;p&gt;There were plenty of bugs, broken implementations, slow models, permission issues, packaging problems, and a lot of moments where something simply refused to work. 😂&lt;/p&gt;
&lt;p&gt;But that's also what made building it interesting.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-exactly-is-iris-&quot;&gt;What exactly is IRIS?&lt;/h3&gt;
&lt;p&gt;IRIS is my attempt at building a &lt;strong&gt;personal AI assistant&lt;/strong&gt;, rather than just another conversational AI application.&lt;/p&gt;
&lt;p&gt;The idea is simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Instead of me adapting to a bunch of different tools, I want one assistant that can work with those tools for me.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can talk to IRIS normally, and depending on the request, it can decide what it needs to do.&lt;/p&gt;
&lt;p&gt;For example, a request might involve:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;User
   ↓
Understand request
   ↓
Determine what needs to happen
   ↓
Select the appropriate tool
   ↓
Check permissions
   ↓
Execute the action
   ↓
Observe the result
   ↓
Respond to the user
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's the direction I wanted IRIS to move toward from the beginning.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;what-can-iris-do-&quot;&gt;What can IRIS do?&lt;/h2&gt;
&lt;h3 id=&quot;-natural-conversations&quot;&gt;💬 Natural conversations&lt;/h3&gt;
&lt;p&gt;At the core of IRIS is a local language model running through &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I'm currently using &lt;strong&gt;Qwen 2.5 3B&lt;/strong&gt; for the conversational side.&lt;/p&gt;
&lt;p&gt;This gives IRIS its ability to understand requests, answer questions, reason about tasks, and interact naturally.&lt;/p&gt;
&lt;p&gt;The important part for me was keeping the core assistant &lt;strong&gt;local&lt;/strong&gt;, rather than building everything around a cloud API.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-voice-interaction&quot;&gt;🎙️ Voice interaction&lt;/h3&gt;
&lt;p&gt;I didn't want IRIS to feel like an application where I always have to type.&lt;/p&gt;
&lt;p&gt;It can accept voice input through the Mac's microphone and convert speech into text.&lt;/p&gt;
&lt;p&gt;The flow is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;My voice
   ↓
Microphone
   ↓
Speech recognition
   ↓
IRIS
   ↓
Response
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IRIS can also speak its responses back using the system's voice output.&lt;/p&gt;
&lt;p&gt;There's even an audio toggle in the interface, so I can choose whether IRIS responds verbally.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-working-with-files&quot;&gt;📁 Working with files&lt;/h3&gt;
&lt;p&gt;IRIS can interact with files on the computer.&lt;/p&gt;
&lt;p&gt;For example, it can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search for files&lt;/li&gt;
&lt;li&gt;Read files&lt;/li&gt;
&lt;li&gt;Create files&lt;/li&gt;
&lt;li&gt;Edit files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For actions that can modify the filesystem, IRIS has a permission/confirmation layer rather than blindly executing everything.&lt;/p&gt;
&lt;p&gt;That's important because giving an AI access to your computer without any safeguards is obviously not something I wanted to do.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-web-search-and-browsing&quot;&gt;🌐 Web search and browsing&lt;/h3&gt;
&lt;p&gt;IRIS can also search the web and retrieve information.&lt;/p&gt;
&lt;p&gt;The system can:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Search
   ↓
Find relevant results
   ↓
Retrieve useful content
   ↓
Process the information
   ↓
Generate an answer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allows IRIS to go beyond the information available inside its local model.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-application-control&quot;&gt;🖥️ Application control&lt;/h3&gt;
&lt;p&gt;One of the things I really wanted was the ability to tell my assistant to interact with applications.&lt;/p&gt;
&lt;p&gt;IRIS can launch supported applications on my Mac.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&quot;Open Calculator.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And IRIS can actually open it.&lt;/p&gt;
&lt;p&gt;This might sound simple, but it's one of the steps toward making an AI assistant something that can &lt;strong&gt;do things&lt;/strong&gt;, rather than simply tell you how to do them.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-memory&quot;&gt;🧠 Memory&lt;/h2&gt;
&lt;p&gt;Another major part of IRIS is memory.&lt;/p&gt;
&lt;p&gt;I didn't want every conversation to feel like starting from zero.&lt;/p&gt;
&lt;p&gt;IRIS has different layers for things such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Working memory&lt;/li&gt;
&lt;li&gt;Long-term memory&lt;/li&gt;
&lt;li&gt;Personal profile&lt;/li&gt;
&lt;li&gt;Conversation state&lt;/li&gt;
&lt;li&gt;Memory retrieval&lt;/li&gt;
&lt;li&gt;Memory updates&lt;/li&gt;
&lt;li&gt;Memory deletion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea is that information can be stored and later retrieved when it's relevant.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;Remember that this project is called IRIS.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Later:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;What was the project I told you about?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The assistant should be able to connect those two conversations.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-vision&quot;&gt;👁️ Vision&lt;/h2&gt;
&lt;p&gt;IRIS can also understand screenshots.&lt;/p&gt;
&lt;p&gt;For this, I integrated a local vision model:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Granite 3.2 Vision 2B&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The workflow is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Screenshot
    ↓
Image processing
    ↓
Vision model
    ↓
IRIS understands the screen
    ↓
Response
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This opens up a completely different direction for the project.&lt;/p&gt;
&lt;p&gt;Instead of only understanding text, IRIS can start understanding &lt;strong&gt;what is actually happening on the screen&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-planning-and-autonomous-tasks&quot;&gt;🤖 Planning and autonomous tasks&lt;/h2&gt;
&lt;p&gt;Another major part of IRIS is task planning.&lt;/p&gt;
&lt;p&gt;For more complicated requests, the assistant can break a goal into smaller steps.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Goal
 ↓
Task 1
 ↓
Task 2
 ↓
Task 3
 ↓
Observe results
 ↓
Recover from failures
 ↓
Complete task
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I built components for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Planning&lt;/li&gt;
&lt;li&gt;Task decomposition&lt;/li&gt;
&lt;li&gt;Multi-step execution&lt;/li&gt;
&lt;li&gt;Observation&lt;/li&gt;
&lt;li&gt;Recovery&lt;/li&gt;
&lt;li&gt;Task state&lt;/li&gt;
&lt;li&gt;Goal tracking&lt;/li&gt;
&lt;li&gt;Agent memory&lt;/li&gt;
&lt;li&gt;Evaluation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is to eventually move from:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&quot;Tell me how to do this.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&quot;Do this for me.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-permissions-and-safety&quot;&gt;🔐 Permissions and safety&lt;/h2&gt;
&lt;p&gt;This was something I didn't want to ignore.&lt;/p&gt;
&lt;p&gt;An AI assistant with access to your computer needs boundaries.&lt;/p&gt;
&lt;p&gt;IRIS has a permission system that distinguishes between different types of actions.&lt;/p&gt;
&lt;p&gt;Some actions can happen directly, while potentially risky actions can require confirmation.&lt;/p&gt;
&lt;p&gt;For example, filesystem and terminal operations can require permission before execution.&lt;/p&gt;
&lt;p&gt;The idea is simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;IRIS should be capable, but it shouldn't blindly do everything it can.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-plugins&quot;&gt;🧩 Plugins&lt;/h2&gt;
&lt;p&gt;I also added a plugin system so IRIS doesn't have to remain limited to the tools I originally built.&lt;/p&gt;
&lt;p&gt;Plugins can provide additional capabilities while following a common interface.&lt;/p&gt;
&lt;p&gt;That means the architecture can eventually grow from:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;IRIS
 ├── Files
 ├── Web
 ├── Applications
 ├── System
 └── Memory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;into something more extensible:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;IRIS
 ├── Core tools
 ├── Plugins
 ├── External capabilities
 └── Future integrations
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-how-iris-is-structured&quot;&gt;🏗️ How IRIS is structured&lt;/h2&gt;
&lt;p&gt;The project has grown into multiple layers rather than being one giant Python file.&lt;/p&gt;
&lt;p&gt;At a high level:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                    IRIS
                     │
             ┌───────┴───────┐
             │               │
          Interface         Brain
             │               │
       ┌─────┴─────┐    ┌────┴─────┐
       │           │    │          │
      Chat       Voice  Memory   Planning
                             
                     │
                Tool Layer
                     │
       ┌─────────────┼─────────────┐
       │             │             │
    Files          Web          System
       │             │             │
 Applications     Search       Computer
                     │
                   Vision
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exact implementation is more detailed, but this is the basic idea.&lt;/p&gt;
&lt;p&gt;The interface talks to the assistant engine, the engine can use memory and planning, and the tool layer gives IRIS the ability to interact with the computer and the outside world.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-tech-stack&quot;&gt;🛠️ Tech stack&lt;/h2&gt;
&lt;p&gt;Some of the main technologies behind IRIS are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PySide6&lt;/strong&gt; — desktop interface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ollama&lt;/strong&gt; — local model runtime&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 2.5 3B&lt;/strong&gt; — local language model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Granite 3.2 Vision 2B&lt;/strong&gt; — vision&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nomic Embed&lt;/strong&gt; — embeddings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyInstaller&lt;/strong&gt; — macOS application packaging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The project currently runs as a proper &lt;strong&gt;macOS application&lt;/strong&gt;, so I don't need to open VS Code and run a Python command every time I want to use it.&lt;/p&gt;
&lt;p&gt;I can simply launch IRIS like a normal application.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-the-difficult-part-wasn-t-always-the-ai&quot;&gt;😅 The difficult part wasn't always the AI&lt;/h2&gt;
&lt;p&gt;One thing I learned while building IRIS is that making an AI assistant isn't just about connecting an LLM to a chat box.&lt;/p&gt;
&lt;p&gt;A lot of the work was actually around the systems surrounding the model.&lt;/p&gt;
&lt;p&gt;Things like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Voice input&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Getting the microphone, speech detection, silence detection and packaged application permissions working correctly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Making sure memories can actually be stored, retrieved, updated and forgotten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool execution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Making sure the assistant can select and execute the correct tool without breaking everything around it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vision&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Getting screenshot analysis fast enough to actually be useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Permissions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Allowing IRIS to interact with the computer without giving it unlimited freedom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Packaging&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Turning a Python project with all these dependencies into an actual Mac application was its own challenge.&lt;/p&gt;
&lt;p&gt;Those problems taught me something important:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Building an AI product is much more than building the model.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The model is only one part of the system.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-what-s-next-&quot;&gt;🚀 What's next?&lt;/h2&gt;
&lt;p&gt;I'm not considering IRIS finished.&lt;/p&gt;
&lt;p&gt;There are still a lot of things I want to improve.&lt;/p&gt;
&lt;p&gt;The next direction is focused less on simply adding more features and more on making IRIS &lt;strong&gt;actually smarter and more useful&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Some of the things I want to work on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better tool selection&lt;/li&gt;
&lt;li&gt;Better understanding of natural language&lt;/li&gt;
&lt;li&gt;Stronger conversational context&lt;/li&gt;
&lt;li&gt;More reliable memory&lt;/li&gt;
&lt;li&gt;Better autonomous task execution&lt;/li&gt;
&lt;li&gt;Improved computer control&lt;/li&gt;
&lt;li&gt;Better screen understanding&lt;/li&gt;
&lt;li&gt;More robust error recovery&lt;/li&gt;
&lt;li&gt;Faster responses&lt;/li&gt;
&lt;li&gt;More integrations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eventually, I want to be able to give IRIS a goal and have it figure out the steps itself while keeping me in control of important actions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;IRIS started because &lt;strong&gt;I've always wanted to build my own personal assistant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It could have stayed as an idea.&lt;/p&gt;
&lt;p&gt;Instead, I decided to actually build it.&lt;/p&gt;
&lt;p&gt;There were plenty of times when things broke, features had to be rebuilt, and the project became much more complicated than I initially expected.&lt;/p&gt;
&lt;p&gt;But that's probably my favorite part of the project.&lt;/p&gt;
&lt;p&gt;I'm not just experimenting with an AI model anymore.&lt;/p&gt;
&lt;p&gt;I'm building a system around it.&lt;/p&gt;
&lt;p&gt;Something that can &lt;strong&gt;see, listen, remember, reason, use tools and interact with my computer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It's still far from the assistant I imagine in my head.&lt;/p&gt;
&lt;p&gt;But now I can actually open my Mac, launch IRIS, talk to it and watch that idea come to life.&lt;/p&gt;
&lt;p&gt;And honestly, I'm just getting started. 🚀&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30075/i-built-my-own-personal-ai-assistant-meet-iris</guid>
<pubDate>Wed, 07 Oct 2026 06:52:43 +0000</pubDate>
</item>
</channel>
</rss>