2025 06 21 recall session #1

Ben Fisher builds Recall, a tool syncing iPhone texts and calls into Addio CRM. He explores pulling data from local iCloud databases on macOS, decides on an email-forwarding approach to use Addio's existing interaction tracking, and uses Claude and Cursor to break down the work.
Chapters
All right, so I'm going to try something new here where I'm going to start recording me experimenting with AI and record my sessions and talk through a little bit around the different tools I'm using, what I'm finding and hopefully it'll be interesting. If nothing else, maybe I'll break down crying. Yeah, let's learn together. One of the problems is that there's just so much stuff, right. Even as someone who's technical, it's hard to keep up with. And so one of the things that I do is to create real projects that actually I solve a problem for myself and, and, and do it in a way in which I'm layering in experimenting with some of these tools and learning some of the technologies and stuff that I'm interested in. And so in this case I've put together a sort of spec and actually I used AI to help me flesh out the spec but short version of it. The product's called Recall and what it does is I use Addio as a CRM which is overall like a great CRM but it's missing some what I consider like critical features for me, one of which is that Addio it's connected to my email so like all my email accounts is connected to it's analyzing you know, frequency of interactions it has like last interacted date. But most, a lot of the people that I communicate with, especially once I'm like close to them is through text messaging or phone calls. And so I wish Addio took into account text messages I sent and phone calls in its in the record that it, it stores about yours. And so I that's what we're going to do. We're going to using Adio's APIs layer in a. Basically we'll solve it through some software that you can install on a computer that will and get access to all of the text messages and phone calls you've made. And what Apple does through the icloud is it actually synchronizes a version of that keeps a database on your machine that you can programmatically access from on your computer. They don't have any APIs or anything. So this was the solution I came came up with because part of the goal here is I want Addio to surface to me people who I who are important but I haven't communicated with in say the last four weeks, the last six months. And in some cases I want to be very intentional certainly when it comes to business of being like making sure that I'm staying in touch with someone at Least every six months or so. And again, if it's only looking at my email app, it emails, it has a very distorted sense of who am I communicating with or not. And so yeah, this is a must have for me. I will say ADIO does not have a workflow built into their tool that does anything around cadences where it's like as of right now, even if I had this data in adeo, it doesn't have any workflow automations to like ping me or create a task to follow up with someone. If it's been six months since we last communicated, fortunately adio doesn't have that yet. So that would be sort of like version seven of what we build here. But the first version is just getting those interactions reflected in the ADIO CRM for some. So I had already started, I spent about an hour the other day doing some proof of concept stuff to just understand the simplest way to solve this problem. And, and for context, we're going to be building this in, in Node, which is not a language that or it's not a framework that I am particularly familiar with, but it's rooted in JavaScript and that's. That is a language that I have a fair amount of experience with. And part of the reason I could have chosen Python, could have chose Node and basically any script where or any language where I could have run a file on my machine. I chose Node specifically because I just want to continue to familiarize myself with JavaScript based syntax encoding because it ties into, you know, working with React or working with Vue versus Python. Python, great language, but it doesn't come up as much in my life as much as node or JavaScript does. And so I strategically decided to use Node. The exception would be like if it for some reason would be dramatically more complicated to solve this problem using Node rather than Python. But I talked to the AI for a little bit, just trying to get a sense of was there a strong reason to use either one. And it basically said no, which based off my experience, sounds about right. So I put together a quick scope of what we're building. I also have outlined some of the dot some of the tools that I'm using. So, you know, this is much more extensive than you would typically do for a project for yourself. But I did want this to be somewhat of a reflection of how I approach building out products and thinking about products and planning it. And so I'll share this document. I won't read it out aloud, but I'll share a copy of this one thing that's always really important, especially when doing proof of concepts. And I sold this from the basecamp guys at 37 signals. Basecamp guys is basically non goals like what is this not going to do explicitly? And so I have a few of those. Yeah, I. What are the core core functionalities? Typically when you're doing a spec, you probably wouldn't be going into the technical architecture at this level. Although I, I tend, I do tend to jump to especially around something like this where initially the question was how could I technically feasibly even do this because iCloud does iCloud which has your imessage has your messages if you have an iPhone. Initially I wasn't sure if there was a technical solution, but I started thinking about and exploring whether or not there was a database on our local machines in order to synchronize imessage across your devices and your phone call information. That's when I came across yes, it does actually do that. And so I was able to find those two databases on my machine. And let's see here, the way that this will work is I have my contacts app on my computer and every hour our script or our product recall will check to see if there's any new phone calls or text messages to sync back to adia the Sierra. One of the decisions I had to make was, you know, how should this event exist within adeo like are there specific ways that Adeo like does have the concept of events? Should this exist as an event? Should it exist as a simulated phone call? Like what would actually tie into downstream any of these functionalities or ways that I want to actually leverage the fact that an event happened? Based off my research, I actually didn't look to see if I could technically make it a phone call within adio's API or I'm sorry, as an email. What I'm but what I generally think I'm going to do is do this through notes where I've already again with the initial, I will choose a friend who probably would not bother or be concerned with being someone Internet famous for me to use as her example, Chelsea. So I actually I ran this and because Chelsea and I have been texting so I used her initially just to test this out. You can see like you know, 80 days of emails or 80 emails rather there's activity. What I'm doing right now is I'm doing notes that are timestamp of when the text message or phone call happened. So in this case and what I'm doing right now is I am putting the contents of the text message as a note. What I'd probably do and it's fine because it's private and for me but what I might do would be using like an LLM like you know, GPT4 mini or something and just instead, instead of having the exact transcript describe generally what was the text message or even like if it's a conversation, wouldn't make sense to have every single text message necessarily synced to the CRM. What I would do instead is do it in chunks and have the LLM describe what the conversation is. So that way you'd have one note that might, you know, describe an hour of texting but I would break it up so that like maybe the clock changes on a daily basis. Like if I text for to text Chelsea throughout the day all those conversations would be shown would be reflected as a single note that describes what we're texting about. Any sort of action items or things that I agreed to or that she agreed to text exchange. But there would be a hard set of like at the end of the day that would create a new note. Right. So rather than create a note for every single interaction, have it on like a daily, daily basis. That way we're tracking whether or not how long ago did Ben and Chelsea last interaction and then I did a little bit of searching in Adio's APIs and I created a Persona within ChatGPT of being an Adio expert and asked it I described the product we're building and then I asked it what properties or events are would be best would be yeah best suited for for these phone call SMS events given context and basically what it had suggested was doing this as fields well create notes and then what we'll do on top of that is add some properties that are computed on the pull up that my documentation in a few minutes. But let's see here. That's the gist of it though. I'll be using cloud code to build this plus cursor. I actually use cursor as like the CLI and it works dramatically better for me than just using cursor and cursor chat. So we're using cloud code sometimes I'll. I'm still figuring out exactly the flow here that works well for me. The other piece of this from I've been building using AI really extensively like daily for the last nine months. I'm still. And it's crazy how much of it's already dramatically improved and changed. Like even the tools you're using and the workflows are using and so part of the purpose of me doing this project is to develop a point of view on how to build this stuff, how I want to approach this. And so one of the things that's become very clear is that LLMs do a much better job when you break a task down into tasks and subtasks. In fact, that's, that's critical, especially when you're using it to build code. And so I was recently introduced to Taskmaster, which is a free open source library that I'm experimenting with and playing with through building this, this product. What it does is it helps you break down your project into tasks and subtasks and do planning and then it uses that with the LLM. So what you're able to do essentially is keep track of like assign small specific tasks to the LLM and then it can kind of go through and build it, which the. My expectation is that it will lead to a lot fewer problems where anyone who's coded using cursor or cloud code or whatever like they've gotten you will encounter situations where it just goes around circularly. It doesn't know how to like, it just keeps making the same mistakes or it's absolutely maddening. And so Taskmaster, or at least it's a way where it's really around doc rooted in documentation. It's like a document driven approach, which I just stole that token, stole that term, I think from Brian Vaughn in Hampton. He actually has something called document driven programming. But my expectation this will lead to much more productive coding sessions and I'll include the links to all this stuff in the show notes. But I'm just going to go ahead and start building this and add some commentary as I'm going. But as I said, I've never done this before. Not sure how this will work, but I think it will be certainly with you. If you have any questions as I'm going, feel free to send me messages and I'm happy to dig into any of the stuff I'm doing or expand upon it. Here's the app I'm building. Part of what I. What I would typically do though is I would actually use a tool like LINEAR to track projects and tasks and do my planning and a lot of documentation. But for now I'm just going to stick with what Taskmaster has because the whole point of this is to become familiar with Taskmaster and see to what extent it actually helps. So we're gonna believe Taskmaster keeps track of tasks and subtasks just using like a markdown file. And so if we were just Getting started. I already did this. Follow the instructions, you give it your API keys for a bunch of different of the LLMs out there, and then you can add, specify your preference of which LLM do you want to use, and you can specify different LLMs if you wanted it for the actual, like, coding of a task versus the researching. Because you can actually use Taskmaster to help you research tasks, which all of this I used to do myself using. Well, in Claude code, I would create prompts that were specific to having Claude research or investigate an issue or a ticket. But now Taskmaster, it's actually baked into as a command, as a part of Taskmaster, which makes sense. Awesome. So if I open up Cursor and I will say, I'm not. I'm a Jetbrains guy. Like, my background's in PHP predominantly. And so it's definitely been a challenge migrating over to Cursor because I'm not a VS code guy. And there's a lot of shortcuts and just like, basic functionalities that are pretty unique to Jetbrains that, like, I'm having to force myself to start to overwrite some of the muscle memory. So let's see here. So one of the things that Taskmaster has is a readme read where this will continue to be updated as we're building, but you can see where it's broken in and summarized all the different tasks and subtasks, what's been completed or not. It has. You can specify dependencies, recommended next tasks, and again, part of the, you know, I am only generally familiar with exactly what it does. And so this is. This is how I learn. I think how a lot of us learn is by just building something. And I focus on building things that actually are useful. Not just building for the sake of building, but finding things that actually would be. I'd be excited about if I had built it and could use it myself. And I don't think I said this, but one of my intentions with this is to work on Pebble. You know, as someone who, as a product person and builder, I think one of the challenges I've had is getting oftentimes too isolated and separate from, like, feedback, and especially if I'm not just building it for myself. And that's something that I'm committed to changing. And so this is an honest effort of me, both working in public, because I. I hope that what I'm working on and thinking about is useful to other people. I also hope that it leads to me to better understand some of these concepts as well as to meet people who are working on interesting stuff, to share a little bit around me, because this is not a side. Unless you've worked directly with me. The way I approach projects like, you know, no one's aware of how I approach this. And if there's anything or anything that you recognize in the way I approach the work and you have suggestions or observations, would love to hear them. At the end of the day, this is all getting 1% better every single day. Okay, so I had run Taskmaster. See here I'm not going to get into any of the nuances around like creating markdown files with directions for Claude and stuff like that, because that goes beyond the purpose of this initial reporting. But part of what Taskmaster does is you first what you do. And this is why I didn't. I generated a PRD document which I've kind of described, which is here. Here's what we're building. Here's why it matters. Here are all the general phases of it. I use Warp as my terminal, if I already mentioned that, but really like it enables you to do natural language with the terminal as opposed to having to know syntactically every single command. You can just write stuff like. Right. And another thing to know is I use speech to text. So I'll be speaking out some of these commands and you'll might sound. It might sound bizarre, but it's because I use whisper flow, which will. This is me talking to the microphone. Please show how this works. See, figure out. Actually I could do list all the files in this directory, including hidden ones. So Warp takes what I wrote and then it. It figures out the command to run the bash command. So here you go. Pretty cool. So basically it's a smart terminal. All right. So initially what you do is you create this PRD text file. Then we'll see as Taskmaster has a bunch of. See if. How to get the list up. Right. So Taskmaster has all of these commands you can run. Init is what you initially do where you can initialize a new project. But I've already done that. Create special needs files. Parse. PRD is where you have it analyze your. Your. Your PRD doc, which from there it generates tasks and subtasks, lists all the tasks. So we'll say pass, measure, list, which would give us a list of all of our. This is me actually having Claude. So I'm in Claude code right now, and then I'm running task master commands. Remove then Claude. 18 tasks complete, 2% done call history. So as I mentioned, I started working on this the other day I spent about an hour on it just to build the initial proof of concept of can I code something and then have create a note and have a note show up in Addio using the, the API. And I could, I did see here, if we go into. Let's see. I think we can do run the verify setup JS file. So I mean we could, I could just run this file or I could tell Claud what I really should do is tell it to give me the command to run it man command. The files are in there straight, but you can see here where it's actually part of what's cool about having Claude run the files. It's also getting the errors spit back to it. In some cases it self corrects it and stuff. It's funny because this is working on my machine. Okay, there we go. Commit these changes to Git. We'll see if it figures out git versus get. Oh yeah, see there it does. And so now it's giving me the commit message that it wants to commit. Say yes. And I just committed that to go. All right, run the verify setup again and give me the command so I can just run it myself. And again this is within Claude code and I'm using the, the max plan which gives you like. There we go. Now see here you come with some better names for this stuff. But just please analyze the final sync file and describe what it does and the flow of information. Probably need to orient myself around this. How much has been built left. So end to end workflow queries 5 most recent messages strengths phone numbers, filters Right. And so I had come across some use cases where in some cases the person doesn't exist yet in Adio, but they exist in my address book. And so when that happens that there's a text message that needs to be synced to add you but the person doesn't exist. It creates the person. But what I realized you first need to check to see. Well, very few phone. I have very few phone numbers in Adeo. So if the phone, if I was texting with someone, it first needs to see, okay, what was their. What's their email address? And does that person exist in Adeo? And if they do exist in Adio by their email address, then we just need to add. Update that record and add their phone number. Not just add a new. Not just add the record with the person's phone number. So you realize like, so as you start digging into this, there are these like edge cases I even thought about and so built out some of that logic again just through conversation with the Vaan AI and running the script, testing it out. I will say that I know that some of my friends approach this through basically a flavor of test driven development. They first write tests. I have not built that way but I'm. I am keen to think try that approach but not, not in this project. This project I'm just going to be feels relatively straightforward. Just building the thing see here connects primary search and then what we'll do is. All right, so let's see here. Cool. So in that case, trying to see that's one of my Domains, not a porncompany.com It's a long story. I've had it for a very long time. And that's just one of her email addresses. She works with me. So she also has a skinny and bald.com email. As I said, like this is a brand new ADIO account. So some of these need to be merged as well. That needs to be like a whole another project. Merge them. Yeah, okay. Yeah. So 7,000 emails, calls, activity, notes. All right, so that is from the most we have it. So part of this end to end is it's doing the last five messages, think what's the logic? And then extracts the phone number. If the phone number doesn't exist in adio, then using my address book it checks to see, well, what's their email address. Then it checks to see if a user exists with that email address. So if I were to like open the contacts, I'm going to just do this on a different screen, show any private information. This is a great example of I told it to analyze the file and describe what it does in flow of information. I've used this as a strategy in general to familiarize myself not just with my own code bases, but I've used it to help me figure out defined documentation for other engineers as well as to understand like open source projects or other people's files. It's like a really effective way to leverage AI to better understand something, to dig into it and ask a bunch of questions. What I understand is functionally what have we done is left reader. Here's the code for me and what I'll often do here is I'll think through like end to end the experience before I start digging into like building out a perfectly extensive app. Because at the end of the day what I'm first trying to do is, is the way that I'm adding notes going to accomplish what I want. So for example, I was talking to Claude earlier trying to get Here so one of my son is this I was using actually I was using Claude I Greek chat chat there's a custom came across of called or some guys that recommend it was just chat PRD just curious to try it. So I gave it my PRD and been using it to get feedback on it there I think I was talking to it asking it to be patio expert create it in here. Where is this? Yeah, in this case I just created a very simple prompt. I just quickly trying to understand this. Like typically when you're creating prompts I'd go much more extensive into Personas and stuff like that. But in this case I'm just trying to have a chat conversation where it's an expert@patio CRM what it had recommended and what I was asking it was okay so if we're going to create notes what is the best way to reflect the most recent interaction date within adio? Update the last interaction date via API. Part of what's annoying about this though is that there's already a computed believe interaction date. So like this is an example where you know ADIO automatically is calculating the last email interaction, last calendar interaction, last here, last interaction. But you know, I want if I create a custom property that's based off of me texting or emailing phone calling them, it's not going to take into account any of the email interactions. Okay, is there a way to have this custom field also take into consideration my last email interaction date or last interaction? Because there's already a property called last interaction, we are adding additional interactions through email through SMS and phone calls. But there will also be like maybe I've emailed with the person more recently than I have had a phone or SMS conversation with them. Is there a way to take in the most recent date through this property rather than just having it be the most recent SMS or phone call date? For reference, there's already a property called last interaction and it takes into account currently dynamically the last email interaction and the last calendar interaction. Is there any way for us to programmatically send an event that will be automatically computed by ADIO as a last interaction event? Right, because you don't want to. I don't think I don't. I want to avoid overriding or coming up with an alternative to their last interaction property. But also we want it dynamically calculated and so what we want it looking at is the most recent date of the last email last calendar. In our case we're adding in last phone call, last SMS and it'll always take into Account the most recent event, not just looking at the ones that we're manually setting. So basically what we'd want to do is add another property like last last phone interaction that could be SMS or phone call. And so what we'd want is last interaction to look at the last email property, the last calendar property and now the last we'll call it phone property or SMS property. And from that it will set the last interaction based off which one happened most recently. I'm just going to paste and see see this. Obviously it's not worded particularly well, but okay. I wonder if we're able to it Gosh darn it. A little tad. Yeah see see if there's hex. I'm curious about formula. Unless there is a formula this should be. This will be annoying within the UI youI'm unable to modify the last interaction property. Like I can't change the formula or anything like that. Are you programmatically able to access it? I assume not. It's annoying number of times I have it suggesting ideas to me and then just being completely wrong like no, that's actually not possible. Very obviously I also don't see a formula and one of the things that like there are a few resources online that you can use I believe like one's context 7 which has access to a bunch of APIs that you can use up to date documentation for albums and and then the way you use that is I believe use that as an MCP server and then with cursor you say when you're investigating an API then say or an MSP or yeah, let's say API you say use context 7 and it will know to reference the MCP to context 7. This is also somewhat uncomfortable because I actually have three screens but I can only record one. So I have a lot of my stuff consolidated now on this screen Web search. There's no mention format calculated to be the term. This is why you also build proof of concepts like these are the big big questions. And I think one thing you could do is create a list. Is there a way to programmatically give the illusion using Adio's APIs that a phone call was placed can we place phone call event with adio's API? That would actually be a solution that was all blot actually. I mean I also wonder if I could do a similar thing around the email side giving the illusion that an email was exchanged with them. Then what you would do is you create a filter where last center was for say I haven't spoken to a person in 10 days. So in theory what you do is you'd create different views like people for quarterly, monthly, weekly, yearly. How do we or must in order for that property or value to be set? Does it have to. Does its phone recorder have to have been on the call? How is that even set? How do you use Addio's API in access to phone event? Is it an event and can we send phone event or record phone events with the API? I'm not satisfied with their answer. I don't really feel like they're actually analyzed, but apparently it's not that customizable. See if we can figure out how to phone call it. Missions. Another option would be to have a calendar event that happened at the time, but I would need to associate that calendar event with that person. You can manually add the audio call record in a meeting. It I really want to use adio's native interaction functionality. So what we could do instead is create a calendar event that I texted them. What I don't want to do is actually add their real email address. So I actually think the solution here would be like I want to. I think I would create a calendar event on my calendar. We can even create a new calendar called Events like phone events or Interactions so it doesn't block my actual real calendar. Then what we would do is when I'm exchanging text messages with someone, it would create an event for the first one. It only does one event per day per person rather. And then I think we would need to dynamically create a skinny and bald email address. Like a doesn't have to be real, but we would have them as RCP'd on the calendar event. And we would create the calendar event using the the dummy email address plus the person's name maybe or their email address. That way@skinnyandball.com we would add that if one doesn't already exist to the to the person's contacts and RSVP them to the event. So actually here's how we would need to do it. I think. I think I've come up with a solution. Possibly. But help me think this through. Maybe there's a better one. Just pull up the Google Doc. So Adios native events. It looks for email encounter events. When I exchange text messages or phone calls with someone, create a calendar event, but only one per day. First check to see if we have a fake call it call phantom event email address for them in contacts. It would be something like you just pull up an example and they would be added as an attendee on the meeting and we'll say the meeting. We'd always have it be like 5 minutes or 15 minutes or something. And so this wouldn't actually be like a calendar. Event calendar, actually just scheduling. Then what I would do is create. Okay, okay. Get their audio ID that. Actually I was super email user. Actually I don't even think I need to do that. Great. I just need to do it within Adio. If they don't creep persons audio ID that skinny balls. Now let's see. I have to test see if this will actually work, but I think it would it so addio tracks it as a contraction. I can test this with D. I wonder how often it sinks though. Let's see if it works. We'll try this with Chelsea. I. All right, See that? And then let's add a calendar event. Now you're seeing the how all this stuff works. All right, let's create a new there configure make available people group. Let's see if this works. Oh, there we go. That should do it. Now let's go back to meeting from this place. I don't think I have any view to show up. All right, let's go back to Chelsea. That's her audio. Gosh darn it. It's really. No, guys, seriously, this is gotta be kidding. Oh, come on. So let's try this. That's not how we're gonna do it, but let's just see if that works. Then I need to add that as a calendar within. It's interesting that I what I'm trying to do is find my calendar settings or can see what calendars do I even have. All right, so I reconnected the calendar. This might be another way to do it too. Alternatively do it by forwarding emails and create the illusion of an email that was sent by the person and that we're forwarding it. We programmatically send an email to my account adio receipt like receiving email address. And we'd create the illusion of us forwarding an email with the contents of that email being where the from was the person's actual email address. You don't even need to use the the person ID solution because we could actually use the person's actual email address. Their system will parse it believing that's an actual real email being forwarded. And then the body of that email could be text message. And if it's a phone call, then we would just have the body of the email being like phone call placed. And then we'd have the timestamp of this forwarded Email match the time of the text message that'd work. I guess what we don't necessarily know though is that actually is a better solution than this calendar idea. Although now I'm kind of curious to see if it would show up if my calendar idea would have worked. Well actually I think we'll go with the email forwarding solution because that way we don't have to start creating like these fake email addresses for people. But I'm somewhat satisfied the fact that it would have worked and that's actually a pretty cool solution on I was like this is an interesting flavor of problem where it's some and because again part of the goal here was to leverage adio's native functionality it would make no sense to recreate that. So like the simple way would have been to fake it to trick it. Let's see here see if Chelsea that some are sorry there's a bunch of Duke bits in here that need to be solved as they're going through this exercise I'm increasingly actually annoyed with that video. I expect that once it's done parsing I'm interested males kidding. Here's the structure of a Ford and we can test this by say that before that to them say it'll be for yesterday when it was Chelsea's actual email. Okay so as soon as it shows up here. Oh see, there we go. Nice. So my calendar event idea would have worked because now it shows that and then I my guess is the most recent interaction would now be 79 century action. Wonder if it's looking at the right well that's that and I realize a lot of this has nothing to do with AI so far so we can come back to this but this should work. I expected it will show up here. It's a little surprising to me though even though it shows mutation see if we can find proper it false I wonder how long this will take though. How dare they should work it there is see I'm sure this will work See this is a good solution. Well I'm satisfied so knowing that it meets you down with this one all right off to give us some time so but let's give it this as all let's do this because that does programmatically change some stuff because we'll fill ascending mouse certain thinking the ethical tos concern My God, give me a break. All right. You found oh thank you AI yeah yeah. Why would I no, I'm not going to do that. Might not parse for emails yes it will. Let's assume that they'll Parse emails perfectly fine. And this also avoids having to like create additional fake email addresses for people, which would be confusing because I could inadvertently accidentally start emailing the wrong person if the wrong email address is picked. This is a better solution all around. It's much better than the other idea I had around creating phantom ghost calendar events. So what we should do is we will use the structure I gave you where we will use their real primary email address and send it to the Adeo email address from me. But the email must come from me because I believe Addio does parse to verify that I that Bennett, skinny and ball.com is the thing sending the email. The way we could do that most simply would probably to be actually through an N8N integration where we send a webhook to N8N and we could actually create two different N8N. We could do most of this on the N8N side and just tell N8 the N8N workflow who the person is. And then I believe N8N could send an email through its existing Gmail integration and send an email from me to the Adeo email address. That way we don't have to deal with. Otherwise we would have to build out a solution with a script that spoofs my email address and that could, I think, deal with dkim issues. Unless we. Because we wouldn't want to actually create the functionality to have a Gmail integration and have it actually send me an email from my Gmail account. What we want to do is spoof it by faking the headers, but I would imagine Addio is smart enough to detect that, although maybe it's not. Let's first see if we can send an email spoofed where we're spoofing the headers from bencunningenvald.com, where we just put that as the from and we'll see if Addio rejects it. So let's start with a test to see if that works. That was a lot of slots. Please update our PRD and requirements as well as our tasks with taskmaster to reflect this email forwarding solution, but also include within the PRD the direction we're not going to go, which was to create a calendar event that's hidden. Actually, I'll give you the full description of what my other idea was. Oh, interesting. I guess they could do that. It's interesting idea. Here's the idea we're not going to do, but worth documenting it as a considered idea that we're not doing within our trd. See what you're saying there. So I'm not going to show you this piece. See here. App security. How do I create a password file? Right. It. Yeah, we're going through. We're adding all this stuff where core innovation objective update, reflected depth and audio. Right. I'll just create it anyway. There we go. No harm, no foul. What I have it doing is creating new tasks to reflect the email forwarding approach and then subtask and then have Taskmaster show all of the tasks within Taskmaster. What I love is I can misspell or misspeak and it still will figure out on time or so control R. So this is it. So implement. So what you can see here is it has all of these different and I guess it's also hard to go to the readme thing. So go under investigates Taskmaster expand and research to break down. I've added the API keys. Try sending a test email and spoof it as though it came from Joel and forwarding an email frame. Make sure API cushion. See if this works. We're using Claude code plus Taskmaster for breaking down projects, helping with research and creating subtasks. Fingers crossed. Cool. All right, let's see if it's sent. Cool. It worked. Actually, it did send the email. That was a lot easier than I expected. And we're in. Let's go in here and make sure that Joel exists. Oh, wow. It already came in. Strange to me. Last email interaction was 14 days ago. Except when you click on it, you can see that the email came. That doesn't make any sense. Oh, no. There we go. Shows lasting. Strange though, that the Chelsea one's not. Let's try this then. This works though. Spoof another email. This one coming from? Sure. We'll do this one with the phone. I love solutions like this. So if I heard Chelsea, I wonder why the other first one didn't work though. We'll see how long that takes if I go into GitHub. Here's all the changes we've made while working together so far. We modified the Claude markdown file. Email foiling froze. That should not have been updating it. That should have been the project readme. You should have added the project PRD document with the approaches and the one that we skipped. Looks like you updated Claude markdown file. Remove your Claude markdown file changes. Because what I gave you around the forwarding email approach and the calendar approach were related to the product scope. Please fix that and add it to the prd. Yeah, see stuff like this, that drives me crazy sometimes. I often will work a lot faster than I could talk it. So like, you know, we've spent an hour, two hours now on this. I got down this to 20 minutes. Maybe not, but it's hard to verbalize everything. None of the product scope or PRD stuff should be in the Claud markdown file. Claude markdown file is simply for best practices for us using Claude code and building. So spoofing tasks here all the tasks are made. Here's the change in within the PRD document. Yeah, they're saying it's important to learn how to avoid this project. Otherwise the same when building something else. Although I don't think I've had this issue before. In this session we focus on thinking through the problem, coming up with alternative solutions and building a quick proof of concept to test an idea. Chelsea's sharing five minutes ago. It's cool that solution works. Let's see how it. Yes. And then what we're also going to do is have the contents of the email. Yeah, I guess what I'm wondering does it still make sense have a note with the contents of the email? I don't necessarily want what people's text messages into emails. That makes sense from a privacy perspective as well as I just don't want that. So having notes that summarize what we talk about might make more sense. But for now let's just say that the interaction happened, not actually say what the interaction was about, but you can see what it's doing. Previously what I had it doing was creating notes like with the person's email correspondence. I had to create notes that represented the person's communication and now we're replacing it with emails and backdating the timestamp of the email. So now it's contacts proceeds to process and reaction forwarded to Addie overseeing D shows up. Oh, because we texted at 9:37. It's funny. Let's see if I did that. This, this what's interesting is it's actually backdating. Huh. That's interesting. It actually able to have them show up. This is fascinating in Gmail as though the email was received back then. That's interesting. You know what I mean? So the way that we're spoofing this and we're changing the timestamp when I sent the email it also has now changed the time. Like right now it's 5pm so we obviously changed that. But then we also were able to overwrite the time that we sent the email and forwarded it to Adeo and it's showing up at 9:37am as though I forwarded this email to Adeo at 9:37am but we forwarded it right now at 4:52pm I do love these aspects of the Internet where you realize there's still some things that are just somewhat stupid. I love stuff like that. That's fascinating because it's just reading the timestamp of the email. It's not right now at 4:52 p. I do love these aspects of the Internet where you realize there's still some things that are just somewhat stupid. I love stuff like that. That's fascinating because it's just reading the timestamp of the email. It's not. You can override it. Spoof it. Interesting. All right, so let's see here. Source treat. Here are the changes key component. I don't think you can override it. Spoof it. Interesting. All right, so let's see here. Source tree here the changes key components. Again, I don't know why Claude still has I'm not sure it actually makes sense for it to have any of that stuff, frankly. Analyze the change Again, I don't know why Claude still has I'm not sure it actually makes sense for it to have any of that stuff, frankly. Analyze the changed files and generate commits Files and generate commits but make the commits sequentially. Don't just commit everything all at once. Commitment the files and commit files that make sense to be committed together. But make the commits sequentially. Don't just commit everything all at once. Commit the files and commit files that make sense to be committed together. It generated the commit message. Then we're going to do here. Bad idea of this note Taskmaster. I think it's list Is there a mark? Something we could do is next if we do control R this gives us identify route table what's it do? Create a base connection Enables link communication sharing system what are we using the database for? What's its purpose and what's the logic? My assumption is it's to keep track of which communications we've already synchronized. But really Addio should be the source of truth. The purpose of a database was really just to not keep resyncing the same events because what we want to make sure of is that we're not resyncing like we don't want to process the same text message a few times. We don't want to forward the email three times. We want to have it unique where we're only sending events to Addio that don't already exist in adio. It's interesting building in another language and framework. Part of what I'm trying to understand here is how to build dry modular code. I'm not just trying to build a thing, I'm also trying to do it in a way that's reasonably well done and maintainable. But again, that's not the primary goal here. It's really on the AI side and building something to solve it. This is also an opportunity to continue to improve upon and understand how to build modular node code. See what this does. Message extracts the messages, find people have been texting, sync them for sure. Call history, recall, place source. Is a database really necessary though? Could we do this instead by just verifying in ADEO whether that interaction has already been tracked? How might you propose we do that? Because in the happy path we would be just looking at events that happened in the past hour. There will be periods where we've missed something. In theory, maybe we need to look backwards and we don't want to have to sync duplicate events initially. When we first run this, we're going to want to look backwards the last 90 days to do an initial sync. But there will be situations if bugs happen where we might miss the code didn't run for an hour. Or maybe we got some interactions, but not all of them. The idea is a local SQLite for deduplication tracking. We'd only store interaction IDs. That makes sense. Yeah. And we're not saving actual messages. You're absolutely right. No local state. Well, the other point here too is if I have multiple computers and we're running this from a new machine, my machine, where I'm running this file might not have ever synced to Add IO, But Addio already has the data from a previous company that did it. So having a local database is not reliable for the purposes of this. It would make sense it was in the cloud, but not locally because I might wipe my computer and then do it from a new computer. I might want to have this code running on a couple different devices. So having it reference a local database is just not reliable. Now the AI is going to tell me that I'm right, but we're going to now tell it to make a note of that. So that context is important. Identify something flaw. Smart sync. Yes. Please update the approach and explain why we're not doing the other one and what the edge cases are and why we're taking this approach. I think this is a good ending period for the first part of this, what we've accomplished. A better solution for how we're going to send events into Adeo to leverage Adeo's native last interaction functionality rather than having to come off their own. It would not have been a very elegant solution. It would have relied too much on us constantly updating it. Like it just wouldn't been feasible. Sorry. So, some truth. Yeah. Cool. I wonder if I can use AI to analyze this transcript and what I'm doing in it to briefly summarize into a Google Doc what we're building and what I've accomplished and make it interesting because, I mean, this is all new territory for me and you know, I think one of the reasons why something somewhat reluctant to recording these working sessions, besides trying to figure out am I inadvertently revealing any API keys or whatever, is then doing all the work of creating content that documents what we've done here and how to like, you know, what's the format in which people would actually want to consume. Jesus. Claude markdown file is not where you store anything around the prd. The Claude markdown file is specifically for how we work with CLAUDE code and build moments like this. Please analyze our CLAUDE markdown file and research best practices of how to leverage the Claude markdown file with a programming project. My assumption is the cloud markdown file is where we define coding style and standards. Yeah, see, like in this case, it's using TheOpticsMCP. I've been making an FCP call for the tool to be able to read a website. Interesting. It. Yes. Refactor the markdown file to follow the best practices. Well, please commit the changes. You're doing this on Saturday. We should get coffee sometime. Yeah, we should. Man. I'm doing a live stream of me coding. Are you? Yeah, I'm trying to turn it into content. The AI coding thing. Well, I'm in AI too. We should get. I know we should. That sounds great. Remind me your name. Pete. Pete. So, as a quick recap, what we did was summarize what we accomplished in today's programming session. In my experience, working with CLAUDE code is just so much better than curse. It's not even close. Yeah, the key piece of it is you do need to break down tasks granularly. I typically do this within linear for tasks and subtask management, but I'm experimenting and doing documentation through Taskmaster. Here's what we accomplished today. It's great because it can analyze everything that changed. Programming session summary, implemented email forwarding system solved deduplication architectural problems. I don't remember researching optimal memory infrastructure. What is that? Even that where did I even find? Does even mean there's a mischaracterization. Yes. Optimal way for querying local the shade. Right. Then we're gonna do here. Bad idea of this. Nope. Taskmaster. Essentially, I think it's list complete. We could do is next control R. This gives us identify route table. What's it do? Database connection. Cool. All right. To be continued. Enables link communication track system. What are we using the database for? What's its purpose and what's the logic? My assumption is it's to keep track of which communications we've already synchronized. But really, Addio should be the source of truth.






