Project Overview

An automated system that uses AI to generate personalized questions, emails them to your contact list on a schedule, and captures responses to build a permanent archive of meaningful conversations. It eliminates the friction of maintaining consistent communication by handling question generation, delivery, and storage automatically, while ensuring each question is unique and tailored to your relationship history.


Why I Built This

My wife and I have had a couple’s journal for a few years. Each week, we both answer the same question side by side in an Apple note. Seeing each other’s responses to questions has generated lots of great discussions. We have loved maintaining this practice over the years.

But there are a few problems with our current approach: we had to find or create the weekly questions, and we had to remember to answer them. So, I originally built this project for us to use but have since generalized it.


How It Works

The system uses AI and email to create an automated journal for groups to use:

  1. AI Question Generation: On a schedule, Claude analyzes past questions and generates a new question
  2. Email Delivery: The question gets sent to all users with a simple subject line and reply address
  3. Response Collection: When users reply, answers automatically get stored in the database
  4. Archive Building: All answers are stored for review on their own and past questions are stored for use in future prompts

High-Level Architecture

CleanShot Freeform-2025-09-09.png


The Magic is in the Context

Good questions aren't random - they should build on your shared history. Here's how I made that work:

def create_formatted_prompt(question_gen_prompt):
    """
    Create a formatted prompt for the Anthropic API.
    Inserts the retrieved questions into the prompt.
    """
    previous_questions, question_temp_id = format_questions()

    # Insert past year's questions into the prompt so Claude
    # can generate something truly unique
    formatted_prompt = question_gen_prompt.format(
        previous_questions=previous_questions
    )
    return formatted_prompt, question_temp_id

This means Claude isn't just generating questions. It's looking at everything discussed in the past year and creating something that builds on actual conversations and interests. The questions feel personal because they are personal.