{
  "version": 1,
  "siteUrl": "https://www.dontaiwilson.com",
  "pages": [
    {
      "url": "https://www.dontaiwilson.com/",
      "title": "Dontai Wilson - Web Design & Application Development",
      "description": "Explore Dontai Wilson’s custom websites, full-stack applications, and AI-enabled systems, bringing interface design and engineering together.",
      "heading": "An eye for detail. A mind for what’s possible.",
      "sections": [
        {
          "heading": "An eye for detail. A mind for what’s possible.",
          "level": 1,
          "paragraphs": [
            "I bring interface design and engineering together, from a website’s first impression to the software that supports it."
          ],
          "items": []
        },
        {
          "heading": "A better presence. A stronger impression.",
          "level": 2,
          "paragraphs": [
            "Redesigning websites with clearer structure, considered visuals, and a more thoughtful user experience.",
            "Web development Application engineering"
          ],
          "items": []
        },
        {
          "heading": "Behind the work.",
          "level": 2,
          "paragraphs": [
            "Dontai Wilson Design · Build · Deploy"
          ],
          "items": []
        },
        {
          "heading": "Curiosity across disciplines. Care in the details.",
          "level": 3,
          "paragraphs": [
            "I’m drawn to the space between how something feels and how it works. Sometimes that means refining an interface. Sometimes it means designing the system underneath it.",
            "I think about products as connected systems: the people using them, the decisions that shape them, and what it takes to keep them useful over time."
          ],
          "items": []
        },
        {
          "heading": "Two ways I can help.",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Web Development",
          "level": 3,
          "paragraphs": [
            "Thoughtful websites with a clearer story and a better experience across screens."
          ],
          "items": [
            "Visual direction",
            "Responsive interfaces",
            "Implementation"
          ]
        },
        {
          "heading": "Applications",
          "level": 3,
          "paragraphs": [
            "Useful software that connects real workflows with the systems underneath."
          ],
          "items": [
            "Full-stack software",
            "AI-enabled systems",
            "Mobile applications"
          ]
        },
        {
          "heading": "Selected work.",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "CoreMemory",
          "level": 3,
          "paragraphs": [
            "Context that stays yours.",
            "Your AI tools change. Your context shouldn’t get lost. CoreMemory keeps memory portable, reviewable, and under your control."
          ],
          "items": []
        },
        {
          "heading": "JAICE",
          "level": 3,
          "paragraphs": [
            "Your search. Back in focus.",
            "Applications in one tab. Updates buried in email. JAICE brings your job search into one workspace, so progress and next steps are easier to see."
          ],
          "items": []
        },
        {
          "heading": "More to explore.",
          "level": 3,
          "paragraphs": [
            "Explore more applications, experiments, and the decisions behind them."
          ],
          "items": []
        },
        {
          "heading": "Let’s build what’s next.",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Have something in mind?",
          "level": 3,
          "paragraphs": [
            "Rethinking a website, building an application, or hiring? Let’s talk about what comes next."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/websites",
      "title": "Custom Websites & Website Redesign - Dontai Wilson",
      "description": "Custom websites and redesigns by Dontai Wilson, with accessible interfaces, responsive layouts, connected payments, and ownership of your source code.",
      "heading": "Handcrafted for your business. Built to be yours.",
      "sections": [
        {
          "heading": "Handcrafted for your business. Built to be yours.",
          "level": 1,
          "paragraphs": [
            "Custom websites built from the ground up. Designed for your customers, accessible across experiences, and shaped around what your business actually needs."
          ],
          "items": []
        },
        {
          "heading": "Pay for the website. Own the work.",
          "level": 2,
          "paragraphs": [
            "Your design, your implementation, and the freedom to choose how it grows."
          ],
          "items": [
            "Built around your needs",
            "Source code handed over",
            "Fewer subscription dependencies"
          ]
        },
        {
          "heading": "Your business. Your way of doing things.",
          "level": 2,
          "paragraphs": [
            "Design, content, and custom features shaped around your business, from a focused website to an interactive tool."
          ],
          "items": []
        },
        {
          "heading": "Customer journey",
          "level": 3,
          "paragraphs": [
            "Clear paths from first visit to enquiry or purchase."
          ],
          "items": []
        },
        {
          "heading": "Brand presence",
          "level": 3,
          "paragraphs": [
            "Pages that show customers what makes you different."
          ],
          "items": []
        },
        {
          "heading": "Custom functionality",
          "level": 3,
          "paragraphs": [
            "Custom tools that fit the way your business works."
          ],
          "items": []
        },
        {
          "heading": "Accessible by design. Better for everyone.",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "More ways to navigate",
          "level": 3,
          "paragraphs": [
            "Keyboard access and clear structure for people using screen readers."
          ],
          "items": []
        },
        {
          "heading": "Easier to understand",
          "level": 3,
          "paragraphs": [
            "Clear labels, readable contrast, and useful feedback when things go wrong."
          ],
          "items": []
        },
        {
          "heading": "Individual needs",
          "level": 3,
          "paragraphs": [
            "Comfortable controls, flexible layouts, and support for zoom and reduced motion."
          ],
          "items": []
        },
        {
          "heading": "Thoughtful on every screen. Fast where it counts.",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Every screen. Fully considered.",
          "level": 3,
          "paragraphs": [],
          "items": [
            "Layouts tailored to each screen",
            "Navigation that feels natural",
            "Comfortable forms and controls",
            "Essential tasks on every device"
          ]
        },
        {
          "heading": "Less waiting. More doing.",
          "level": 3,
          "paragraphs": [],
          "items": [
            "Optimized images and formats",
            "Content loaded when needed",
            "Lean, purpose-built components",
            "Clear structure and search metadata"
          ]
        },
        {
          "heading": "Your pricing rules. A connected checkout.",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Custom pricingCalculations built around your rules.",
            "Connected paymentsCheckout, deposits, and recurring payments.",
            "Clear costsProvider fees made clear."
          ]
        },
        {
          "heading": "Buy the build. Keep the freedom.",
          "level": 2,
          "paragraphs": [
            "You own the custom implementation, including the source code and project files. Continue with me, your team, or another developer.",
            "Build what is useful, reduce unnecessary subscriptions, and keep control over future changes."
          ],
          "items": []
        },
        {
          "heading": "Costs tied to your needs.",
          "level": 3,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "The build",
          "level": 4,
          "paragraphs": [
            "Design and features scoped to fit."
          ],
          "items": []
        },
        {
          "heading": "Running it",
          "level": 4,
          "paragraphs": [
            "Hosting and services that fit."
          ],
          "items": []
        },
        {
          "heading": "Future work",
          "level": 4,
          "paragraphs": [
            "Updates agreed before work begins."
          ],
          "items": []
        },
        {
          "heading": "Yours to run. Support when you want it.",
          "level": 2,
          "paragraphs": [
            "A personal setup walkthrough, clear documentation, and the access you need to run and update your website."
          ],
          "items": []
        },
        {
          "heading": "Manage it yourself",
          "level": 3,
          "paragraphs": [
            "Take over content updates and maintenance with clear instructions and a personal walkthrough of your setup."
          ],
          "items": []
        },
        {
          "heading": "Keep me involved",
          "level": 3,
          "paragraphs": [
            "Focus on your business while I handle maintenance and technical details. Scope and cost agreed up front.",
            "No hidden ownership terms, extra handover fees, or required maintenance subscription. Ongoing support is your choice."
          ],
          "items": []
        },
        {
          "heading": "Keep what works. Rethink what you pay for.",
          "level": 2,
          "paragraphs": [
            "Let’s review your site, cut unnecessary spending, and optimize around your actual needs."
          ],
          "items": []
        },
        {
          "heading": "Let’s build something that fits your business.",
          "level": 2,
          "paragraphs": [
            "Bring your goals, your current site, or an idea. We’ll work out what is worth building."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects",
      "title": "Application Development & Projects - Dontai Wilson",
      "description": "Explore Dontai Wilson’s full-stack applications, native mobile tools, and AI-enabled workflows, with project breakdowns and engineering decisions.",
      "heading": "Applications",
      "sections": [
        {
          "heading": "Applications",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Built around the task. Connected underneath.",
          "level": 2,
          "paragraphs": [
            "I build web and mobile applications around the work people need to do, connecting clear interfaces with the data and services behind them."
          ],
          "items": []
        },
        {
          "heading": "One workflow. Connected layers.",
          "level": 2,
          "paragraphs": [],
          "items": [
            "The experienceInterfaces and feedback",
            "The applicationRules and integrations",
            "The source of truthRecords and access"
          ]
        },
        {
          "heading": "Different platforms. The same care.",
          "level": 2,
          "paragraphs": [
            "Choose the tools that fit the problem, from browser-based workspaces to native mobile experiences and AI-assisted services."
          ],
          "items": []
        },
        {
          "heading": "Full-stack applications",
          "level": 3,
          "paragraphs": [
            "Workspaces, dashboards, and custom tools that connect what people see with the services and data behind it."
          ],
          "items": [
            "React",
            "TypeScript",
            "Python",
            "PostgreSQL"
          ]
        },
        {
          "heading": "Native mobile tools",
          "level": 3,
          "paragraphs": [
            "Mobile tools that use device features and local storage to support the way people work on the go."
          ],
          "items": [
            "SwiftUI",
            "Kotlin",
            "SQLite",
            "Core Location"
          ]
        },
        {
          "heading": "AI-enabled workflows",
          "level": 3,
          "paragraphs": [
            "Classification, conversational tools, and relevant context, with clear limits on what the model can access and change."
          ],
          "items": [
            "FastAPI",
            "LangGraph",
            "OpenAI API",
            "Python"
          ]
        },
        {
          "heading": "Care in the build. Clarity in the decisions.",
          "level": 2,
          "paragraphs": [
            "I plan for the full workflow: how information moves, where decisions belong, and how the application responds when something goes wrong."
          ],
          "items": []
        },
        {
          "heading": "Start with the workflow",
          "level": 3,
          "paragraphs": [
            "Understand the task, the people involved, and the exceptions before choosing the features or architecture."
          ],
          "items": []
        },
        {
          "heading": "Make ownership explicit",
          "level": 3,
          "paragraphs": [
            "Define who can access each record and action. Enforce those rules in the backend and database."
          ],
          "items": []
        },
        {
          "heading": "Check the consequential paths",
          "level": 3,
          "paragraphs": [
            "Test important state changes and integration boundaries, including failure cases that can interrupt the workflow."
          ],
          "items": []
        },
        {
          "heading": "Build for the next change",
          "level": 3,
          "paragraphs": [
            "Separate responsibilities and document decisions so future changes have a clear place to start."
          ],
          "items": []
        },
        {
          "heading": "Useful intelligence. Clear boundaries.",
          "level": 2,
          "paragraphs": [
            "AI can help interpret requests and find relevant information. The application still enforces business rules, permissions, and actions that change data.",
            "People should be able to review the result, understand uncertainty, and confirm actions when the stakes call for it."
          ],
          "items": []
        },
        {
          "heading": "Interpret and assist",
          "level": 3,
          "paragraphs": [
            "Classify incoming information, retrieve relevant context, and explain the options available."
          ],
          "items": []
        },
        {
          "heading": "Verify and act",
          "level": 3,
          "paragraphs": [
            "Check access, apply business rules, and require confirmation before making a consequential change."
          ],
          "items": []
        },
        {
          "heading": "The thinking. Put into practice.",
          "level": 2,
          "paragraphs": [
            "Explore the implementation details and tradeoffs behind these applications."
          ],
          "items": []
        },
        {
          "heading": "JAICE",
          "level": 3,
          "paragraphs": [
            "Connected services, background processing, and a shared data model bring a fragmented job search into one workspace."
          ],
          "items": []
        },
        {
          "heading": "RefundsAI",
          "level": 3,
          "paragraphs": [
            "AI assistance with backend policy checks, explicit confirmation, and transaction records that people can review."
          ],
          "items": []
        },
        {
          "heading": "Simple Miles",
          "level": 3,
          "paragraphs": [
            "Native iOS tracking combines device signals, pause-aware trip state, and local persistence around real driving patterns."
          ],
          "items": []
        },
        {
          "heading": "Have a workflow worth improving?",
          "level": 2,
          "paragraphs": [
            "Have an application idea or a system that needs attention? Tell me what you want to make easier."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/about",
      "title": "About Dontai Wilson - Design & Engineering",
      "description": "Meet Dontai Wilson, a Full Stack AI Engineer connecting interface design, product thinking, and system engineering. Learn how he approaches the work.",
      "heading": "Curiosity in the work. Care in the details.",
      "sections": [
        {
          "heading": "Curiosity in the work. Care in the details.",
          "level": 1,
          "paragraphs": [
            "I’m Dontai, a Full Stack AI Engineer drawn to the space between how a product feels and how it works.",
            "I enjoy moving between interface design and engineering, understanding the task, refining the experience, and making the pieces work together."
          ],
          "items": []
        },
        {
          "heading": "The experience. The system behind it.",
          "level": 2,
          "paragraphs": [
            "I think about products as connected systems: the people using them, the decisions that shape them, and what it takes to keep them useful over time.",
            "When I work on a feature, I consider the experience it creates and the maintenance it leaves behind. Both shape the decisions I make.",
            "Finding that balance is what keeps me coming back to product development."
          ],
          "items": []
        },
        {
          "heading": "Intent in the decisions. Care through the process.",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Design with intentStart with who the product helps, what they need to do, and the expectations the experience should set.",
            "Build with clarityKeep each part understandable on its own, with clear responsibilities as the system becomes more capable.",
            "Deploy with foresightConsider performance, maintenance, and running costs together. Adapt the architecture as the product and its needs develop."
          ]
        },
        {
          "heading": "Across the details. Without losing the whole.",
          "level": 2,
          "paragraphs": [
            "I’m at my best when a product needs someone to connect user needs, system design, and the work of building it."
          ],
          "items": [
            "Connect the idea to the systemWork through an idea, identify the decisions it depends on, and turn it into a practical plan for building.",
            "Keep the whole product in viewMove between the interface, API, data model, and deployment without losing sight of the person using the product.",
            "Find clarity in the unknownsBreak an open question into smaller decisions, test assumptions, and use what I learn to shape the next step.",
            "Care about what comes afterThink beyond the first release to how a product behaves, what it costs to run, and how it can change."
          ]
        },
        {
          "heading": "Good work starts with a conversation.",
          "level": 2,
          "paragraphs": [
            "Have a product to build, an experience to improve, or a role in mind? Let’s talk about where I can help."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/contact",
      "title": "Contact Dontai Wilson - Websites & Applications",
      "description": "Talk with Dontai Wilson about a custom website, application, collaboration, or engineering role. Reach out by email or connect on LinkedIn.",
      "heading": "Have something in mind? Let’s talk it through.",
      "sections": [
        {
          "heading": "Have something in mind? Let’s talk it through.",
          "level": 1,
          "paragraphs": [
            "Building a website or application, or looking for someone to join your team? Tell me what you have in mind."
          ],
          "items": []
        },
        {
          "heading": "Email",
          "level": 2,
          "paragraphs": [
            "Tell me about a project, a problem to solve, or an opportunity to work together."
          ],
          "items": []
        },
        {
          "heading": "LinkedIn",
          "level": 2,
          "paragraphs": [
            "Connect with me professionally or reach out about an engineering role on your team."
          ],
          "items": []
        },
        {
          "heading": "GitHub",
          "level": 2,
          "paragraphs": [
            "Browse my public repositories to see how I approach implementation and organize the work."
          ],
          "items": []
        },
        {
          "heading": "A little context. A useful starting point.",
          "level": 2,
          "paragraphs": [
            "You don’t need a finished brief. A few details can help us start with the right questions."
          ],
          "items": []
        },
        {
          "heading": "What you have in mind",
          "level": 3,
          "paragraphs": [
            "The idea, the problem, or the experience you want to improve."
          ],
          "items": []
        },
        {
          "heading": "Where things stand",
          "level": 3,
          "paragraphs": [
            "What already exists, what you have tried, and where you need help moving forward."
          ],
          "items": []
        },
        {
          "heading": "What matters most",
          "level": 3,
          "paragraphs": [
            "The outcome you want, your timeline, and any budget or technical constraints to consider."
          ],
          "items": []
        },
        {
          "heading": "Start with an idea. We’ll take it from there.",
          "level": 2,
          "paragraphs": [
            "Share what you’re thinking about. We can discuss what makes sense and where I can help."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects/RefundsAI",
      "title": "RefundsAI - Dontai Wilson",
      "description": "Bounded AI refund agent that interprets customer requests while keeping policy, consent, and transaction execution under deterministic backend control.",
      "heading": "RefundsAI",
      "sections": [
        {
          "heading": "RefundsAI",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Natural conversation. Controlled transactions.",
          "level": 2,
          "paragraphs": [
            "A conversational refund workflow that keeps policy, consent, and transaction execution under backend control."
          ],
          "items": [
            "Platform",
            "Web App",
            "Scope",
            "Full-stack",
            "Team",
            "Independent",
            "Status",
            "Complete",
            "Started",
            "Jul 2, 2026"
          ]
        },
        {
          "heading": "Project context",
          "level": 2,
          "paragraphs": [
            "Customer support conversations may appear simple, but refund decisions sit at the intersection of policy, customer intent, transaction state, and irreversible actions.",
            "Introducing AI into that workflow creates a difficult boundary: the system needs enough flexibility to understand natural language without allowing a probabilistic model to become the authority over financial decisions."
          ],
          "items": []
        },
        {
          "heading": "The challenge",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Flexible requests need precise refund rules",
            "Consent cannot depend on model interpretation"
          ]
        },
        {
          "heading": "The approach",
          "level": 2,
          "paragraphs": [],
          "items": [
            "AI explains purchases and available options",
            "Backend services verify and execute changes"
          ]
        },
        {
          "heading": "From intent to interaction",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Describe the requestAsk about a purchase or refund in natural language.",
            "Review the optionsRetrieve purchase facts and evaluate the applicable policy.",
            "Confirm the actionPersist explicit confirmation before the guarded workflow changes transaction state."
          ]
        },
        {
          "heading": "What it makes possible",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Ask in natural language",
          "level": 3,
          "paragraphs": [
            "Find purchases and explore refund options in natural language."
          ],
          "items": []
        },
        {
          "heading": "Confirm before acting",
          "level": 3,
          "paragraphs": [
            "Require explicit consent before changing transaction state."
          ],
          "items": []
        },
        {
          "heading": "Inspect the session",
          "level": 3,
          "paragraphs": [
            "Review policy checks and actions in an ordered audit trail."
          ],
          "items": []
        },
        {
          "heading": "How the pieces fit",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Customer and admin views",
          "level": 3,
          "paragraphs": [
            "Support conversations and review session history."
          ],
          "items": []
        },
        {
          "heading": "Workflow and policy",
          "level": 3,
          "paragraphs": [
            "Keep policy and transactions under backend control."
          ],
          "items": []
        },
        {
          "heading": "Transaction record",
          "level": 3,
          "paragraphs": [
            "Store purchases, consent, and ordered audit events."
          ],
          "items": []
        },
        {
          "heading": "Consent is a persisted fact",
          "level": 3,
          "paragraphs": [
            "Require persisted, once-consumable confirmation before changing a transaction."
          ],
          "items": []
        },
        {
          "heading": "Make the sequence reviewable",
          "level": 3,
          "paragraphs": [
            "Record model, tool, and transaction events in a reviewable sequence."
          ],
          "items": []
        },
        {
          "heading": "Engineering notebook",
          "level": 2,
          "paragraphs": [
            "Explore the design, data flow, and implementation in more detail."
          ],
          "items": []
        },
        {
          "heading": "Customer and admin views",
          "level": 4,
          "paragraphs": [
            "Support conversations and review session history."
          ],
          "items": []
        },
        {
          "heading": "Workflow and policy",
          "level": 4,
          "paragraphs": [
            "Keep policy and transactions under backend control."
          ],
          "items": []
        },
        {
          "heading": "Transaction record",
          "level": 4,
          "paragraphs": [
            "Store purchases, consent, and ordered audit events.",
            "RefundsAI was built to explore how AI agents can participate in transactional workflows without becoming the source of truth.",
            "The system allows customers to ask questions naturally, understand refund eligibility, review purchase information, and move through a refund workflow conversationally. Behind that experience, deterministic services retain control over policy, consent, refund amounts, and transaction state.",
            "The goal is not simply to automate refunds, but to establish a clear boundary between what AI can interpret and explain and what the application must verify before taking action."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "RefundsAI separates conversational orchestration from transaction authority. A Next.js frontend provides customer and administrative interfaces, while FastAPI coordinates request handling, LangGraph workflows, backend services, and PostgreSQL persistence.",
            "The language model is limited to natural-language interpretation, grounded read operations, and explanation. Eligibility, consent validation, refund amounts, and lifecycle transitions are computed and enforced by deterministic backend services.",
            "Mutation workflows require persisted confirmation facts before execution, allowing the system to use an AI agent without granting the model direct authority over transactional state."
          ],
          "items": []
        },
        {
          "heading": "Describe the request",
          "level": 4,
          "paragraphs": [
            "Describe a purchase question or refund request."
          ],
          "items": []
        },
        {
          "heading": "Review the options",
          "level": 4,
          "paragraphs": [
            "Retrieve purchase facts and evaluate refund policy."
          ],
          "items": []
        },
        {
          "heading": "Confirm the action",
          "level": 4,
          "paragraphs": [
            "Save explicit consent before changing a transaction.",
            "Customers open the support panel and describe what they need in natural language, whether they are asking about a purchase, checking refund eligibility, or attempting to begin a refund.",
            "RefundsAI gathers the relevant purchase and policy information, explains the available options, and guides the customer through any required confirmation before an action can occur.",
            "After a transaction progresses, the customer interface reflects the resulting purchase state while administrators can review the complete sequence of decisions, tool calls, validations, and actions through a dedicated audit surface."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "Each chat request enters a LangGraph workflow where customer identity, page context, active workflow state, and conversation context are resolved before tools are selected.",
            "Read-only backend tools retrieve customer records, purchase history, policy rules, and eligibility facts. The model receives only the information required to interpret or explain those results rather than owning the underlying business logic.",
            "When a refund requires action, the backend generates a product-specific confirmation command. Exact confirmation is persisted and validated before guarded mutation services execute the appropriate lifecycle transition. The resulting database state is then verified and surfaced back to both the customer interface and administrative audit timeline."
          ],
          "items": []
        },
        {
          "heading": "Consume confirmation once",
          "level": 4,
          "paragraphs": [
            "Check persisted consent and consume it only once."
          ],
          "items": []
        },
        {
          "heading": "Respect lifecycle boundaries",
          "level": 4,
          "paragraphs": [
            "Wait for external conditions before physical refunds."
          ],
          "items": []
        },
        {
          "heading": "Keep an ordered audit",
          "level": 4,
          "paragraphs": [
            "Keep audit events in their original execution order.",
            "RefundsAI is designed around a simple principle: conversational intelligence and transactional authority should not be the same thing.",
            "The AI can understand flexible customer language, determine which information is relevant, and explain what the system knows. It cannot independently decide that a refund is valid, invent an amount, infer consent, or authorize a transaction.",
            "By narrowing the responsibilities of the model, the system preserves the usability of an AI support experience while keeping consequential decisions explicit, reviewable, and enforceable."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "The platform combines a Next.js and TypeScript frontend, FastAPI backend, LangGraph orchestration layer, OpenAI model integration, and Supabase PostgreSQL persistence.",
            "Application services establish explicit authority boundaries between model-driven reasoning and deterministic business operations. PostgreSQL stores purchase state, confirmation facts, audit sessions, and ordered audit events, while database triggers derive selected deadlines and lifecycle defaults from persisted records.",
            "Refund mutations are protected through exact, once-consumable confirmation gates. Digital and subscription workflows can progress through guarded preparation and issuance, while physical returns stop at return preparation until the required external lifecycle condition is satisfied. Canonical confirmation turns can bypass the language model entirely and complete through deterministic backend execution."
          ],
          "items": []
        },
        {
          "heading": "Bounded Agent Orchestration",
          "level": 4,
          "paragraphs": [
            "Use LangGraph to coordinate interpretation, read tools, and grounded explanations."
          ],
          "items": []
        },
        {
          "heading": "Deterministic Policy Authority",
          "level": 4,
          "paragraphs": [
            "Compute eligibility, deadlines, and amounts from stored facts in backend services."
          ],
          "items": []
        },
        {
          "heading": "Confirmation-Gated Mutations",
          "level": 4,
          "paragraphs": [
            "Require exact, saved confirmation that can be consumed only once before a mutation."
          ],
          "items": []
        },
        {
          "heading": "Context-Aware Purchase Resolution",
          "level": 4,
          "paragraphs": [
            "Resolve purchase references from page context, identifiers, and active workflow state."
          ],
          "items": []
        },
        {
          "heading": "End-to-End Audit Trail",
          "level": 4,
          "paragraphs": [
            "Record ordered model, tool, consent, and transaction events for session review."
          ],
          "items": []
        },
        {
          "heading": "Ask about purchases naturally",
          "level": 5,
          "paragraphs": [
            "Use conversational language to locate purchases, review transaction history, and ask questions without navigating rigid support menus."
          ],
          "items": []
        },
        {
          "heading": "Check refund eligibility",
          "level": 5,
          "paragraphs": [
            "Understand whether a purchase qualifies for a refund using product-specific rules evaluated against actual transaction data."
          ],
          "items": []
        },
        {
          "heading": "Complete guided refund workflows",
          "level": 5,
          "paragraphs": [
            "Move from eligibility review to explicit confirmation and refund processing through a conversational workflow with clearly defined action boundaries."
          ],
          "items": []
        },
        {
          "heading": "Keep consequential actions controlled",
          "level": 5,
          "paragraphs": [
            "Require explicit customer authorization before refund-related state changes can occur rather than allowing conversational ambiguity to trigger transactions."
          ],
          "items": []
        },
        {
          "heading": "Review how decisions were made",
          "level": 5,
          "paragraphs": [
            "Inspect complete support sessions through an administrative audit interface showing model activity, tool usage, validation steps, transaction events, and process metrics."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Bounded Agent Orchestration",
          "level": 6,
          "paragraphs": [
            "Uses LangGraph to coordinate conversational reasoning while restricting the model to interpretation, read-oriented tool selection, and grounded explanation."
          ],
          "items": []
        },
        {
          "heading": "Deterministic Policy Authority",
          "level": 6,
          "paragraphs": [
            "Evaluates refund eligibility, deadlines, amounts, and lifecycle rules through backend services operating on persisted purchase facts rather than model inference."
          ],
          "items": []
        },
        {
          "heading": "Confirmation-Gated Mutations",
          "level": 6,
          "paragraphs": [
            "Requires exact, persisted, once-consumable confirmation commands before transactional services can modify refund or purchase state."
          ],
          "items": []
        },
        {
          "heading": "Context-Aware Purchase Resolution",
          "level": 6,
          "paragraphs": [
            "Combines page context, active workflows, explicit identifiers, result sets, and compact conversation state to resolve references such as products, purchases, and ordinal selections."
          ],
          "items": []
        },
        {
          "heading": "End-to-End Audit Trail",
          "level": 6,
          "paragraphs": [
            "Persists ordered model, tool, validation, consent, and mutation events and streams them into an administrative interface for session-level inspection and traceability."
          ],
          "items": []
        },
        {
          "heading": "Applied skills",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Agentic system design",
            "Backend engineering",
            "System architecture",
            "Transaction safety",
            "AI orchestration",
            "Frontend engineering"
          ]
        },
        {
          "heading": "Tech stack",
          "level": 2,
          "paragraphs": [],
          "items": [
            "FastAPI",
            "Next.js",
            "Python",
            "TypeScript",
            "LangGraph",
            "OpenAI API",
            "PostgreSQL",
            "Docker"
          ]
        },
        {
          "heading": "Have a related challenge? Let’s talk about it.",
          "level": 2,
          "paragraphs": [
            "Bring an idea, a workflow to improve, or a technical question. We can work through what comes next."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects/CoreMemory",
      "title": "CoreMemory - Dontai Wilson",
      "description": "A user-owned context authority for governing what AI tools can remember, access, and share.",
      "heading": "CoreMemory",
      "sections": [
        {
          "heading": "CoreMemory",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Your context. Under your control.",
          "level": 2,
          "paragraphs": [
            "A shared memory layer for AI tools, with people deciding what is saved, accessed, and shared."
          ],
          "items": [
            "Platform",
            "Web App",
            "Scope",
            "Full-stack",
            "Team",
            "Solo",
            "Status",
            "Active",
            "Started",
            "Apr 1, 2026"
          ]
        },
        {
          "heading": "Project context",
          "level": 2,
          "paragraphs": [
            "As AI becomes more integrated into everyday workflows, users increasingly rely on multiple models and tools to accomplish different tasks.",
            "Over time, context becomes fragmented across systems, forcing users to repeatedly synchronize information, explain project state, and trust individual platforms to manage increasingly personal data."
          ],
          "items": []
        },
        {
          "heading": "The challenge",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Context fragmented across AI tools",
            "Repeated setup and overly broad sharing"
          ]
        },
        {
          "heading": "The approach",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Users review proposed memories",
            "Tools retrieve only permitted context"
          ]
        },
        {
          "heading": "From intent to interaction",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Connect a toolGive an approved AI client a scoped path to your context.",
            "Review its suggestionsAccept, edit, or reject proposed memories before they are saved.",
            "Share with intentReturn relevant, approved context only when the requesting tool has access."
          ]
        },
        {
          "heading": "What it makes possible",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Review before saving",
          "level": 3,
          "paragraphs": [
            "Review and approve context proposed by connected AI tools."
          ],
          "items": []
        },
        {
          "heading": "Control access",
          "level": 3,
          "paragraphs": [
            "Limit tool access and revoke permissions when needed."
          ],
          "items": []
        },
        {
          "heading": "Keep context portable",
          "level": 3,
          "paragraphs": [
            "Share one curated context layer across approved AI tools."
          ],
          "items": []
        },
        {
          "heading": "How the pieces fit",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Curation dashboard",
          "level": 3,
          "paragraphs": [
            "Review proposals and organize shared context."
          ],
          "items": []
        },
        {
          "heading": "Protected MCP service",
          "level": 3,
          "paragraphs": [
            "Apply access rules across supported transports."
          ],
          "items": []
        },
        {
          "heading": "Governed storage",
          "level": 3,
          "paragraphs": [
            "Store durable context within user boundaries."
          ],
          "items": []
        },
        {
          "heading": "Proposals before writes",
          "level": 3,
          "paragraphs": [
            "Tools suggest memories. Users decide what becomes part of the record."
          ],
          "items": []
        },
        {
          "heading": "Policy before retrieval",
          "level": 3,
          "paragraphs": [
            "Check scope and sensitivity before returning relevant context."
          ],
          "items": []
        },
        {
          "heading": "Engineering notebook",
          "level": 2,
          "paragraphs": [
            "Explore the design, data flow, and implementation in more detail."
          ],
          "items": []
        },
        {
          "heading": "Curation dashboard",
          "level": 4,
          "paragraphs": [
            "Review proposals and organize shared context."
          ],
          "items": []
        },
        {
          "heading": "Protected MCP service",
          "level": 4,
          "paragraphs": [
            "Apply access rules across supported transports."
          ],
          "items": []
        },
        {
          "heading": "Governed storage",
          "level": 4,
          "paragraphs": [
            "Store durable context within user boundaries.",
            "CoreMemory explores a different approach to AI context management. Instead of allowing each model to maintain its own isolated understanding of a user, CoreMemory provides a centralized context authority owned and governed by the individual.",
            "Users decide what information should be retained, who can access it, and when that information becomes relevant across the tools they use."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "CoreMemory implements a user-as-control-plane architecture where AI systems can request or propose context, but cannot directly own or mutate the user's source of truth.",
            "The system separates model execution from context ownership. Connected tools interact with a centralized memory authority through scoped access paths, while retrieval, mutation, and visibility rules remain governed by user-controlled policy."
          ],
          "items": []
        },
        {
          "heading": "Connect a tool",
          "level": 4,
          "paragraphs": [
            "Connect an approved tool with scoped memory access."
          ],
          "items": []
        },
        {
          "heading": "Review its suggestions",
          "level": 4,
          "paragraphs": [
            "Review proposed context before it becomes memory."
          ],
          "items": []
        },
        {
          "heading": "Share with intent",
          "level": 4,
          "paragraphs": [
            "Return only relevant context the tool may access.",
            "Users begin by connecting an AI tool to CoreMemory. Rather than granting unrestricted access, connected systems can propose new context for review, allowing users to approve, reject, modify, or organize information before it becomes part of their shared context layer.",
            "Over time, users build a curated source of truth that follows them across tools, reducing repetitive onboarding while maintaining control over what information is shared and with whom."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "A connected AI tool submits proposed memory updates into a review workflow instead of writing directly to storage. The user can approve, reject, edit, categorize, or restrict each proposal before it becomes part of the governed context layer.",
            "When a tool later requests context, CoreMemory evaluates the requesting surface, credential scope, sensitivity rules, and semantic relevance before returning approved information. If the tool is not allowed to access a given category of context, the system returns nothing rather than exposing data by default."
          ],
          "items": []
        },
        {
          "heading": "One shared policy runtime",
          "level": 4,
          "paragraphs": [
            "Share policy checks across web and MCP access."
          ],
          "items": []
        },
        {
          "heading": "Scope each credential",
          "level": 4,
          "paragraphs": [
            "Limit and revoke credentials for connected tools."
          ],
          "items": []
        },
        {
          "heading": "Protect records at storage",
          "level": 4,
          "paragraphs": [
            "Reinforce ownership with database access policies.",
            "CoreMemory is built around four principles: ownership, governance, transparency, and portability.",
            "Context belongs to the individual who creates it, not the systems that consume it. Access should be reviewable, revocable, and intentional. Information should remain visible to the user, while remaining portable across tools and platforms.",
            "Together, these principles create a foundation for managing AI context as capable systems become increasingly autonomous."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "CoreMemory is structured as a pnpm monorepo with a Next.js curation dashboard, a protected MCP service, and PostgreSQL-backed storage. The dashboard gives users visibility into proposed and stored context, while the MCP layer gives approved AI tools a controlled path for retrieval and proposal submission.",
            "A shared runtime layer handles policy enforcement across access paths. Whether a request enters through the web dashboard, protected HTTP, or stdio MCP transport, the same authorization, retrieval, and mutation rules are applied before any context is surfaced or changed."
          ],
          "items": []
        },
        {
          "heading": "Model Context Protocol access",
          "level": 4,
          "paragraphs": [
            "Expose approved context through MCP without transferring ownership of the memory store."
          ],
          "items": []
        },
        {
          "heading": "Proposal-based writes",
          "level": 4,
          "paragraphs": [
            "Queue model suggestions for review before accepted updates become durable memories."
          ],
          "items": []
        },
        {
          "heading": "Delegated credentialing",
          "level": 4,
          "paragraphs": [
            "Give each connected tool scoped credentials that can be limited or revoked."
          ],
          "items": []
        },
        {
          "heading": "Policy-gated retrieval",
          "level": 4,
          "paragraphs": [
            "Check relevance, scope, and sensitivity before returning any stored context."
          ],
          "items": []
        },
        {
          "heading": "RLS-backed storage boundaries",
          "level": 4,
          "paragraphs": [
            "Use PostgreSQL row-level security to reinforce the ownership of stored records."
          ],
          "items": []
        },
        {
          "heading": "Connect AI tools",
          "level": 5,
          "paragraphs": [
            "Allow approved AI systems to access shared context through a governed interface rather than maintaining isolated memory stores."
          ],
          "items": []
        },
        {
          "heading": "Review proposed updates",
          "level": 5,
          "paragraphs": [
            "Maintain control over what information becomes part of your long-term context by reviewing model-generated suggestions before they are accepted."
          ],
          "items": []
        },
        {
          "heading": "Manage access and permissions",
          "level": 5,
          "paragraphs": [
            "Control which tools can access specific categories of information, helping ensure context is shared only when necessary."
          ],
          "items": []
        },
        {
          "heading": "Build a shared source of truth",
          "level": 5,
          "paragraphs": [
            "Reduce repetitive onboarding and context synchronization by maintaining one curated context layer across multiple AI systems."
          ],
          "items": []
        },
        {
          "heading": "Inspect and organize context",
          "level": 5,
          "paragraphs": [
            "Review, categorize, and refine stored information so context remains accurate, relevant, and useful over time."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Model Context Protocol access",
          "level": 6,
          "paragraphs": [
            "CoreMemory exposes controlled memory access through MCP-compatible transports, allowing AI clients to retrieve approved context without owning the underlying memory store."
          ],
          "items": []
        },
        {
          "heading": "Proposal-based writes",
          "level": 6,
          "paragraphs": [
            "Models submit structured memory suggestions into a review queue. The system records the proposal, waits for user action, and only promotes accepted updates into durable memory."
          ],
          "items": []
        },
        {
          "heading": "Delegated credentialing",
          "level": 6,
          "paragraphs": [
            "Connected tools use scoped credentials tied to a specific surface, model, or access profile. Credentials can be limited, revoked, or adjusted without exposing the full memory layer."
          ],
          "items": []
        },
        {
          "heading": "Policy-gated retrieval",
          "level": 6,
          "paragraphs": [
            "Retrieval combines relevance matching with permission checks. Context is only returned when the requesting tool is authorized to access that category, sensitivity level, or user-approved scope."
          ],
          "items": []
        },
        {
          "heading": "RLS-backed storage boundaries",
          "level": 6,
          "paragraphs": [
            "PostgreSQL Row-Level Security reinforces user boundaries at the data layer, reducing reliance on application logic alone for enforcing ownership and access constraints."
          ],
          "items": []
        },
        {
          "heading": "Applied skills",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Full-stack Development",
            "AI Agent Architecture",
            "Database Design",
            "System Security",
            "API Design"
          ]
        },
        {
          "heading": "Tech stack",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Next.js",
            "PostgreSQL",
            "Supabase",
            "TypeScript",
            "MCP SDK",
            "Drizzle ORM",
            "pnpm",
            "Tailwind CSS"
          ]
        },
        {
          "heading": "Have a related challenge? Let’s talk about it.",
          "level": 2,
          "paragraphs": [
            "Bring an idea, a workflow to improve, or a technical question. We can work through what comes next."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects/JAICE",
      "title": "JAICE - Dontai Wilson",
      "description": "Job search command center for centralizing applications, email updates, resumes, analytics, and reviewable AI assistance.",
      "heading": "JAICE",
      "sections": [
        {
          "heading": "JAICE",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "A job search with a clearer picture.",
          "level": 2,
          "paragraphs": [
            "One workspace for applications, email updates, resumes, and reviewable AI assistance."
          ],
          "items": [
            "Platform",
            "Web App",
            "Scope",
            "Full-stack",
            "Team",
            "Small Team",
            "Status",
            "Complete",
            "Started",
            "Sep 1, 2025"
          ]
        },
        {
          "heading": "Project context",
          "level": 2,
          "paragraphs": [
            "The modern job search is spread across dozens of platforms, each maintaining its own timeline, status updates, and communication channels.",
            "Candidates are often left piecing together their application history from emails, hiring portals, spreadsheets, and memory, making it difficult to understand where they stand or what requires attention."
          ],
          "items": []
        },
        {
          "heading": "The challenge",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Updates scattered across portals and email",
            "Follow-ups and progress hard to track"
          ]
        },
        {
          "heading": "The approach",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Email activity becomes a shared application record",
            "Boards, resumes, and analytics stay connected"
          ]
        },
        {
          "heading": "From intent to interaction",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Connect GmailBring job-related communication into the ingestion pipeline.",
            "Organize the activityClassify updates and surface ambiguous messages for review.",
            "Act on the whole pictureTrack stages, review history, and decide what needs attention."
          ]
        },
        {
          "heading": "What it makes possible",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Track the search",
          "level": 3,
          "paragraphs": [
            "Keep applications, updates, and stage history in one place."
          ],
          "items": []
        },
        {
          "heading": "Review incoming updates",
          "level": 3,
          "paragraphs": [
            "Review incoming activity while classification runs."
          ],
          "items": []
        },
        {
          "heading": "Keep the context together",
          "level": 3,
          "paragraphs": [
            "Connect resumes, follow-ups, and analytics to each application."
          ],
          "items": []
        },
        {
          "heading": "How the pieces fit",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Application workspace",
          "level": 3,
          "paragraphs": [
            "Connect boards, resumes, and application history."
          ],
          "items": []
        },
        {
          "heading": "Services and workers",
          "level": 3,
          "paragraphs": [
            "Process and classify updates in the background."
          ],
          "items": []
        },
        {
          "heading": "Authoritative records",
          "level": 3,
          "paragraphs": [
            "Keep workflow records within access boundaries."
          ],
          "items": []
        },
        {
          "heading": "Keep incoming work visible",
          "level": 3,
          "paragraphs": [
            "Show incoming updates while classification continues in the background."
          ],
          "items": []
        },
        {
          "heading": "Use AI for ambiguity",
          "level": 3,
          "paragraphs": [
            "Use rules for clear cases and local AI for ambiguous messages."
          ],
          "items": []
        },
        {
          "heading": "Engineering notebook",
          "level": 2,
          "paragraphs": [
            "Explore the design, data flow, and implementation in more detail."
          ],
          "items": []
        },
        {
          "heading": "Application workspace",
          "level": 4,
          "paragraphs": [
            "Connect boards, resumes, and application history."
          ],
          "items": []
        },
        {
          "heading": "Services and workers",
          "level": 4,
          "paragraphs": [
            "Process and classify updates in the background."
          ],
          "items": []
        },
        {
          "heading": "Authoritative records",
          "level": 4,
          "paragraphs": [
            "Keep workflow records within access boundaries.",
            "JAICE was built to create a single source of truth for the job search.",
            "Instead of forcing users to track opportunities across multiple platforms, the system uses email as a central communication layer to organize applications, updates, interviews, and hiring activity into a unified workspace.",
            "The goal is not simply to automate tracking, but to provide clear visibility into the entire application lifecycle so users can focus on decisions rather than administration."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "JAICE is built as a multi-service application that centralizes the job search lifecycle around a single source of truth. A React frontend provides the user experience, while FastAPI coordinates application logic, Gmail integration, analytics, resume tooling, and AI-assisted workflows.",
            "Background workers handle email ingestion and classification asynchronously, allowing new opportunities to appear immediately while processing continues behind the scenes. PostgreSQL serves as the authoritative data store, ensuring application history, resumes, analytics, and workflow state remain synchronized across the platform.",
            "Rather than optimizing for automation alone, the architecture is designed to keep users informed about how information enters, moves through, and ultimately affects their job search."
          ],
          "items": []
        },
        {
          "heading": "Connect Gmail",
          "level": 4,
          "paragraphs": [
            "Bring job-related email into the ingestion pipeline."
          ],
          "items": []
        },
        {
          "heading": "Organize the activity",
          "level": 4,
          "paragraphs": [
            "Classify updates and surface ambiguity for review."
          ],
          "items": []
        },
        {
          "heading": "Act on the whole picture",
          "level": 4,
          "paragraphs": [
            "Review stages and history to decide what comes next.",
            "Users connect Gmail and allow JAICE to monitor job-related communication.",
            "Incoming emails are reviewed, organized, and surfaced through a centralized dashboard where users can immediately see new activity, track application progress, review previous conversations, and identify opportunities that may require follow-up.",
            "As the search continues, resume management, analytics, and application history remain connected to the same workflow, creating a persistent record that extends beyond a single hiring cycle."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "When a user connects Gmail, JAICE establishes an ingestion pipeline that continuously monitors job-related communication. Incoming messages are retrieved, normalized, encrypted, and staged before entering the classification workflow.",
            "Deterministic rules evaluate relevance and lifecycle status first. Only ambiguous messages are escalated to local AI inference. During processing, users can already see incoming items on the board, making the workflow transparent rather than hiding activity behind background automation.",
            "Once classified, opportunities move into their appropriate stages and become available for analytics, resume workflows, follow-up decisions, and long-term tracking."
          ],
          "items": []
        },
        {
          "heading": "Work off the request path",
          "level": 4,
          "paragraphs": [
            "Run ingestion and classification in background queues."
          ],
          "items": []
        },
        {
          "heading": "Enforce ownership twice",
          "level": 4,
          "paragraphs": [
            "Check ownership in the application and database."
          ],
          "items": []
        },
        {
          "heading": "Synchronize from saved state",
          "level": 4,
          "paragraphs": [
            "Notify clients when authoritative records change.",
            "JAICE is built around visibility, transparency, and user control.",
            "While automation helps reduce manual work, the system is designed to keep users informed about how information is processed, classified, and organized. Rather than hiding uncertainty behind automation, JAICE surfaces ambiguity and encourages review when confidence is limited.",
            "This approach helps ensure users remain informed participants in the process rather than passive observers of automated decisions."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "The platform combines a FastAPI backend, React frontend, PostgreSQL data layer, Redis-backed task queues, and specialized worker services responsible for ingestion, classification, and synchronization.",
            "User identity is managed through Firebase Authentication, while ownership boundaries are enforced through application-level authorization and database-level security policies. Real-time updates notify clients when application data changes, allowing dashboards and boards to remain synchronized with the authoritative database state.",
            "The architecture favors reliability and traceability over aggressive client-side assumptions, ensuring users always interact with verified application data rather than temporary local state."
          ],
          "items": []
        },
        {
          "heading": "Gmail Ingestion Pipeline",
          "level": 4,
          "paragraphs": [
            "Synchronize Gmail, extract and encrypt content, then stage structured application records."
          ],
          "items": []
        },
        {
          "heading": "Rules-First Classification",
          "level": 4,
          "paragraphs": [
            "Classify clear messages with rules and send only uncertain cases to local AI."
          ],
          "items": []
        },
        {
          "heading": "Visible Processing Workflow",
          "level": 4,
          "paragraphs": [
            "Create visible placeholders while classification and validation continue in the background."
          ],
          "items": []
        },
        {
          "heading": "Resume Intelligence Platform",
          "level": 4,
          "paragraphs": [
            "Version resumes, generate PDFs, and offer reviewable feedback without automatic edits."
          ],
          "items": []
        },
        {
          "heading": "Analytics & Lifecycle Tracking",
          "level": 4,
          "paragraphs": [
            "Aggregate application history and stage changes into search-performance reports."
          ],
          "items": []
        },
        {
          "heading": "Centralize application activity",
          "level": 5,
          "paragraphs": [
            "Bring job-related updates from multiple hiring platforms into a single workspace, eliminating the need to monitor dozens of independent dashboards."
          ],
          "items": []
        },
        {
          "heading": "Track application progress",
          "level": 5,
          "paragraphs": [
            "Follow opportunities through each stage of the hiring process, from initial application to interview, offer, rejection, archive, or review."
          ],
          "items": []
        },
        {
          "heading": "Stay on top of follow-ups",
          "level": 5,
          "paragraphs": [
            "Review past communication, identify stalled opportunities, and determine when additional action may be required."
          ],
          "items": []
        },
        {
          "heading": "Manage resumes in one place",
          "level": 5,
          "paragraphs": [
            "Create, organize, and maintain multiple resume versions while tailoring materials for different opportunities and industries."
          ],
          "items": []
        },
        {
          "heading": "Understand job search performance",
          "level": 5,
          "paragraphs": [
            "Analyze application volume, response rates, stage progression, and hiring trends to better understand search effectiveness over time."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Gmail Ingestion Pipeline",
          "level": 6,
          "paragraphs": [
            "Combines Gmail synchronization, Pub/Sub notifications, content extraction, encryption, and staging workflows to transform incoming messages into structured application records."
          ],
          "items": []
        },
        {
          "heading": "Rules-First Classification",
          "level": 6,
          "paragraphs": [
            "Uses deterministic relevance and lifecycle rules as the primary classification mechanism, escalating only uncertain cases to local AI inference."
          ],
          "items": []
        },
        {
          "heading": "Visible Processing Workflow",
          "level": 6,
          "paragraphs": [
            "Creates application placeholders immediately so users can see incoming activity while classification and validation continue asynchronously."
          ],
          "items": []
        },
        {
          "heading": "Resume Intelligence Platform",
          "level": 6,
          "paragraphs": [
            "Supports structured resume versioning, PDF generation, AI-assisted feedback, and reviewable content improvements without automatically altering user content."
          ],
          "items": []
        },
        {
          "heading": "Analytics & Lifecycle Tracking",
          "level": 6,
          "paragraphs": [
            "Aggregates application history, stage transitions, activity patterns, and hiring metrics into a unified reporting system designed to help users understand search performance over time."
          ],
          "items": []
        },
        {
          "heading": "Applied skills",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Distributed systems",
            "Machine learning integration",
            "Task orchestration",
            "System architecture",
            "Accessibility design",
            "Frontend engineering"
          ]
        },
        {
          "heading": "Tech stack",
          "level": 2,
          "paragraphs": [],
          "items": [
            "FastAPI",
            "React",
            "Python",
            "Celery",
            "DistilBERT",
            "DeBERTa",
            "Docker",
            "PostgreSQL"
          ]
        },
        {
          "heading": "Have a related challenge? Let’s talk about it.",
          "level": 2,
          "paragraphs": [
            "Bring an idea, a workflow to improve, or a technical question. We can work through what comes next."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects/Simple-Miles",
      "title": "Simple Miles - Dontai Wilson",
      "description": "iOS mileage tracking app with automatic trip detection, pause-aware recording, local storage, and analytics.",
      "heading": "Simple Miles",
      "sections": [
        {
          "heading": "Simple Miles",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "A workday has more than two stops.",
          "level": 2,
          "paragraphs": [
            "A native iOS mileage tracker designed around driving sessions, temporary pauses, and local trip history."
          ],
          "items": [
            "Platform",
            "Mobile App",
            "Scope",
            "Full-stack",
            "Team",
            "Solo",
            "Status",
            "Complete",
            "Started",
            "Jul 12, 2025"
          ]
        },
        {
          "heading": "Project context",
          "level": 2,
          "paragraphs": [
            "Modern mileage tracking tools were largely designed around simple point-to-point travel, but gig workers rarely operate that way.",
            "Drivers routinely move between multiple stops, pause for deliveries, sit in traffic, make route adjustments, and spend hours working without ever truly ending their driving session. These behaviors often result in fragmented trip records, inaccurate reporting, and unclaimed mileage."
          ],
          "items": []
        },
        {
          "heading": "The challenge",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Frequent stops fragment mileage records",
            "A pause does not always end a trip"
          ]
        },
        {
          "heading": "The approach",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Movement signals drive a trip lifecycle",
            "Paused sessions can resume before finalization"
          ]
        },
        {
          "heading": "From intent to interaction",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Start drivingQualifying movement samples begin the tracking process.",
            "Pause and resumeShort stops stay within the session when driving resumes in time.",
            "Review the recordInspect routes, categorize trips, and explore locally stored summaries."
          ]
        },
        {
          "heading": "What it makes possible",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Record driving sessions",
          "level": 3,
          "paragraphs": [
            "Track driving sessions without ending at every brief stop."
          ],
          "items": []
        },
        {
          "heading": "Review routes",
          "level": 3,
          "paragraphs": [
            "Inspect routes and categorize trips from local history."
          ],
          "items": []
        },
        {
          "heading": "Explore driving patterns",
          "level": 3,
          "paragraphs": [
            "Compare mileage and activity using recorded trip data."
          ],
          "items": []
        },
        {
          "heading": "How the pieces fit",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Native experience",
          "level": 3,
          "paragraphs": [
            "Review active routes, trip history, and analytics."
          ],
          "items": []
        },
        {
          "heading": "Tracking lifecycle",
          "level": 3,
          "paragraphs": [
            "Turn movement into driving and recording states."
          ],
          "items": []
        },
        {
          "heading": "Local persistence",
          "level": 3,
          "paragraphs": [
            "Keep trip records and route geometry on device."
          ],
          "items": []
        },
        {
          "heading": "Treat pauses as part of the journey",
          "level": 3,
          "paragraphs": [
            "Let a paused session resume before finalizing the trip record."
          ],
          "items": []
        },
        {
          "heading": "Keep the core local",
          "level": 3,
          "paragraphs": [
            "Store trips locally, with background tracking subject to device limits."
          ],
          "items": []
        },
        {
          "heading": "Engineering notebook",
          "level": 2,
          "paragraphs": [
            "Explore the design, data flow, and implementation in more detail."
          ],
          "items": []
        },
        {
          "heading": "Native experience",
          "level": 4,
          "paragraphs": [
            "Review active routes, trip history, and analytics."
          ],
          "items": []
        },
        {
          "heading": "Tracking lifecycle",
          "level": 4,
          "paragraphs": [
            "Turn movement into driving and recording states."
          ],
          "items": []
        },
        {
          "heading": "Local persistence",
          "level": 4,
          "paragraphs": [
            "Keep trip records and route geometry on device.",
            "Simple Miles was built around a simple observation: drivers should not have to manually reconstruct their workday.",
            "Rather than treating every stop as the end of a trip, the application attempts to understand driving sessions as a whole. By identifying natural trip boundaries and combining related movement segments, the system produces a more accurate representation of how people actually drive.",
            "The goal is to reduce administrative overhead while helping users maintain accurate mileage records for business reporting, reimbursement, and tax purposes."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "Simple Miles uses a SwiftUI and MVVM-style architecture backed by long-lived view models and singleton managers for location, driving state, travel state, recording, settings, and persistence.",
            "The core tracking pipeline flows through LocationManager, DrivingStateManager, TravelStateManager, and RecordingManager. Location samples are evaluated for distance and speed, translated into driving state, mapped into a travel lifecycle, and then persisted as trip segments through a local SQLite storage layer."
          ],
          "items": []
        },
        {
          "heading": "Start driving",
          "level": 4,
          "paragraphs": [
            "Begin tracking when movement meets driving rules."
          ],
          "items": []
        },
        {
          "heading": "Pause and resume",
          "level": 4,
          "paragraphs": [
            "Keep short stops within a resumable trip session."
          ],
          "items": []
        },
        {
          "heading": "Review the record",
          "level": 4,
          "paragraphs": [
            "Review routes and categorize locally stored trips.",
            "Users begin driving as normal while the application operates in the background. Active trips appear on a live map, allowing users to verify that mileage is being recorded without requiring constant interaction.",
            "As trips are completed, driving activity is automatically organized into cohesive sessions that can be reviewed, categorized, and analyzed. Users can inspect routes, review timestamps, compare personal and business mileage, and explore long-term driving patterns through built-in analytics."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "A driving session begins when Core Location produces qualifying movement samples. The app rejects small movements that may represent GPS drift and large jumps that may represent unreliable data, then uses speed and distance thresholds to determine whether the user is actively driving.",
            "When movement stops, the trip enters a paused state instead of ending immediately. If movement resumes before the pause countdown expires, the trip continues. If the countdown expires, the app finalizes or discards the trip based on configured distance rules before saving the completed record for review and analytics."
          ],
          "items": []
        },
        {
          "heading": "Filter location noise",
          "level": 4,
          "paragraphs": [
            "Reject GPS drift and unreliable location jumps."
          ],
          "items": []
        },
        {
          "heading": "Store geometry locally",
          "level": 4,
          "paragraphs": [
            "Store trip metadata and route geometry in SQLite."
          ],
          "items": []
        },
        {
          "heading": "Account for lifecycle limits",
          "level": 4,
          "paragraphs": [
            "Respect device limits on background trip tracking.",
            "Simple Miles is built around the idea that movement alone does not define a trip.",
            "Accurately identifying trip boundaries requires understanding user behavior rather than simply tracking location updates. The application combines multiple signals from device hardware, motion data, and driving patterns to distinguish temporary interruptions from genuine trip completion.",
            "This approach allows the system to better represent real-world driving behavior, particularly for users whose work involves frequent stops, deliveries, and route changes throughout the day."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "The app is local-first and does not depend on a remote backend. Trip metadata and encoded route geometry are stored with direct SQLite3 access, while settings and last-known location use UserDefaults.",
            "MapKit powers live and historical route visualization, while SQL aggregation supports category totals, day-of-week distance, start-hour histograms, weekly comparisons, and driving summaries. Background location modes and significant-location monitoring support continued tracking when the app is not actively foregrounded, with known limits around terminated-state reconstruction."
          ],
          "items": []
        },
        {
          "heading": "GPS-based driving detection",
          "level": 4,
          "paragraphs": [
            "Use Core Location speed and distance checks to filter drift and unreliable jumps."
          ],
          "items": []
        },
        {
          "heading": "Pause-aware trip lifecycle",
          "level": 4,
          "paragraphs": [
            "Hold temporary stops in a paused state until recording resumes or the timer expires."
          ],
          "items": []
        },
        {
          "heading": "Local SQLite persistence",
          "level": 4,
          "paragraphs": [
            "Keep trip metadata and compressed routes in local SQLite without a remote account."
          ],
          "items": []
        },
        {
          "heading": "Map-based trip review",
          "level": 4,
          "paragraphs": [
            "Render active and historical routes with MapKit polylines, framing, and annotations."
          ],
          "items": []
        },
        {
          "heading": "SQL-backed analytics",
          "level": 4,
          "paragraphs": [
            "Calculate totals, category shares, and weekly comparisons from saved trip records."
          ],
          "items": []
        },
        {
          "heading": "Automatic mileage tracking",
          "level": 5,
          "paragraphs": [
            "Records driving activity in the background, reducing the need for manual trip logging and mileage calculations."
          ],
          "items": []
        },
        {
          "heading": "Intelligent trip reconstruction",
          "level": 5,
          "paragraphs": [
            "Combines related driving segments into cohesive sessions that better reflect real-world driving behavior."
          ],
          "items": []
        },
        {
          "heading": "Live trip visibility",
          "level": 5,
          "paragraphs": [
            "Provides real-time maps and trip status information so users can verify mileage is being captured accurately."
          ],
          "items": []
        },
        {
          "heading": "Business and personal categorization",
          "level": 5,
          "paragraphs": [
            "Separates different types of driving activity, making it easier to understand vehicle usage and prepare mileage records."
          ],
          "items": []
        },
        {
          "heading": "Driving analytics",
          "level": 5,
          "paragraphs": [
            "Surfaces long-term trends including mileage totals, trip duration, busiest days, and driving habits to help users better understand their activity."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "GPS-based driving detection",
          "level": 6,
          "paragraphs": [
            "Uses Core Location speed and distance samples to infer active driving, filtering small movements as potential GPS drift and rejecting large jumps as unreliable location data."
          ],
          "items": []
        },
        {
          "heading": "Pause-aware trip lifecycle",
          "level": 6,
          "paragraphs": [
            "Maps driving state into idle, traveling, and paused states. Temporary stops start a configurable countdown instead of immediately ending the trip."
          ],
          "items": []
        },
        {
          "heading": "Local SQLite persistence",
          "level": 6,
          "paragraphs": [
            "Stores trip metadata and compressed route geometry locally using direct SQLite3 access, supporting offline use without a remote account or backend."
          ],
          "items": []
        },
        {
          "heading": "Map-based trip review",
          "level": 6,
          "paragraphs": [
            "Uses MapKit polylines, annotations, camera controls, and route framing to display active and historical trips for inspection."
          ],
          "items": []
        },
        {
          "heading": "SQL-backed analytics",
          "level": 6,
          "paragraphs": [
            "Calculates mileage totals, category shares, weekday distance, start-hour activity, and weekly comparisons directly from persisted trip records."
          ],
          "items": []
        },
        {
          "heading": "Applied skills",
          "level": 2,
          "paragraphs": [],
          "items": [
            "iOS development",
            "State machine design",
            "Location-based tracking",
            "Local data persistence",
            "UI/UX design"
          ]
        },
        {
          "heading": "Tech stack",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Swift",
            "SwiftUI",
            "CoreLocation",
            "MapKit",
            "SQLite",
            "Combine"
          ]
        },
        {
          "heading": "Have a related challenge? Let’s talk about it.",
          "level": 2,
          "paragraphs": [
            "Bring an idea, a workflow to improve, or a technical question. We can work through what comes next."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects/Simply-Stocks",
      "title": "Simply Stocks - Dontai Wilson",
      "description": "Exploratory stock analysis dashboard testing whether historical and sentiment signals can support directional market predictions.",
      "heading": "Simply Stocks",
      "sections": [
        {
          "heading": "Simply Stocks",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Explore the signal. Inspect the uncertainty.",
          "level": 2,
          "paragraphs": [
            "An exploratory dashboard pairing market history with next-day directional estimates and model context."
          ],
          "items": [
            "Platform",
            "Web App",
            "Scope",
            "Full-stack",
            "Team",
            "Solo",
            "Status",
            "Complete",
            "Started",
            "Mar 7, 2025"
          ]
        },
        {
          "heading": "Project context",
          "level": 2,
          "paragraphs": [
            "Stock prediction is usually framed as a price-forecasting problem, but exact price prediction is noisy, unstable, and difficult to validate.",
            "Simply Stocks approaches the problem more narrowly: given historical market behavior and sentiment signals, can a model identify whether a stock is more likely to close higher or lower than the previous day?"
          ],
          "items": []
        },
        {
          "heading": "The challenge",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Exact price forecasts are noisy",
            "Model output needs context and limits"
          ]
        },
        {
          "heading": "The approach",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Explore direction instead of exact price",
            "Pair estimates with history and evaluation"
          ]
        },
        {
          "heading": "From intent to interaction",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Find a tickerSearch a local symbol list and request market data.",
            "Inspect the historyReview price charts, recent trends, and sentiment context.",
            "Examine the estimateCompare a directional forecast with its probability and limitations."
          ]
        },
        {
          "heading": "What it makes possible",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Explore market history",
          "level": 3,
          "paragraphs": [
            "Search tickers and inspect price history in interactive charts."
          ],
          "items": []
        },
        {
          "heading": "Examine directional estimates",
          "level": 3,
          "paragraphs": [
            "Compare forecasts with trends, sentiment, and probability."
          ],
          "items": []
        },
        {
          "heading": "Keep limits visible",
          "level": 3,
          "paragraphs": [
            "Keep model limits visible alongside exploratory forecasts."
          ],
          "items": []
        },
        {
          "heading": "How the pieces fit",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Interactive dashboard",
          "level": 3,
          "paragraphs": [
            "Explore tickers, market summaries, and charts."
          ],
          "items": []
        },
        {
          "heading": "Data and features",
          "level": 3,
          "paragraphs": [
            "Build features from market history and sentiment."
          ],
          "items": []
        },
        {
          "heading": "Model evaluation",
          "level": 3,
          "paragraphs": [
            "Train models and inspect directional estimates."
          ],
          "items": []
        },
        {
          "heading": "Constrain the question",
          "level": 3,
          "paragraphs": [
            "Estimate next-day direction instead of claiming an exact future price."
          ],
          "items": []
        },
        {
          "heading": "Expose the limits",
          "level": 3,
          "paragraphs": [
            "Show model context and frame forecasts as exploratory estimates."
          ],
          "items": []
        },
        {
          "heading": "Engineering notebook",
          "level": 2,
          "paragraphs": [
            "Explore the design, data flow, and implementation in more detail."
          ],
          "items": []
        },
        {
          "heading": "Interactive dashboard",
          "level": 4,
          "paragraphs": [
            "Explore tickers, market summaries, and charts."
          ],
          "items": []
        },
        {
          "heading": "Data and features",
          "level": 4,
          "paragraphs": [
            "Build features from market history and sentiment."
          ],
          "items": []
        },
        {
          "heading": "Model evaluation",
          "level": 4,
          "paragraphs": [
            "Train models and inspect directional estimates.",
            "Simply Stocks was built as an exploratory machine learning project rather than a production trading tool.",
            "The goal was to test whether basic market signals could support directional predictions with more useful accuracy than random guessing. To make that exploration understandable, the project pairs prediction output with historical charts, market context, and model limitations so users can inspect the data behind the result rather than treating the prediction as a black box."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "Simply Stocks is built as a Python Dash single-page dashboard where the interface, data retrieval, feature engineering, chart rendering, and model inference run inside the same Flask-backed process.",
            "The system is organized into separate view, controller, service, utility, and model layers. Dash callbacks coordinate ticker search, market data retrieval, chart updates, sentiment processing, and per-request model training without a separate REST API or persistent database."
          ],
          "items": []
        },
        {
          "heading": "Find a ticker",
          "level": 4,
          "paragraphs": [
            "Find a ticker and request its market history."
          ],
          "items": []
        },
        {
          "heading": "Inspect the history",
          "level": 4,
          "paragraphs": [
            "Inspect charts alongside trend and sentiment data."
          ],
          "items": []
        },
        {
          "heading": "Examine the estimate",
          "level": 4,
          "paragraphs": [
            "Review forecasts with probability and model limits.",
            "Users search for a stock ticker and review historical price behavior through interactive charts and market summaries.",
            "From there, they can inspect directional prediction output, compare it against recent trends, and review supporting context such as sentiment signals and model probability. The interface is designed to keep the experience simple while making it clear that the prediction is exploratory, not financial advice."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "A ticker request begins with local symbol search, then triggers live requests for daily adjusted market data, company details, news, benchmark data, and optional macro or options inputs.",
            "Historical price data is normalized into OHLCV records, filtered by date range, aggregated for chart display, and transformed into model features. The prediction target is whether the next daily return is positive, allowing the app to generate a directional RISE or FALL forecast rather than an exact price estimate."
          ],
          "items": []
        },
        {
          "heading": "Keep one application process",
          "level": 4,
          "paragraphs": [
            "Run callbacks and inference in one Dash process."
          ],
          "items": []
        },
        {
          "heading": "Evaluate across time",
          "level": 4,
          "paragraphs": [
            "Use time-aware validation and calibrated probabilities."
          ],
          "items": []
        },
        {
          "heading": "Train for the requested ticker",
          "level": 4,
          "paragraphs": [
            "Train ticker-specific classifiers when requested.",
            "Simply Stocks is built around a constrained question: directionality instead of exact price.",
            "That constraint keeps the project focused on signal exploration rather than pretending to forecast the market with certainty. The machine learning layer is intentionally limited, while the broader interface emphasizes historical data presentation, visual inspection, and transparent model boundaries."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "The dashboard uses Dash stores to hold browser-side state while Python callbacks orchestrate data fetching, visualization, and model execution. Plotly renders line, candlestick, and sentiment-overlay charts from server-produced figures.",
            "The modeling layer supports XGBoost and Random Forest classifiers trained per ticker request. XGBoost uses feature selection, randomized parameter search, time-series validation, walk-forward evaluation, and probability calibration, while Random Forest provides an alternate model path with a fixed holdout evaluation."
          ],
          "items": []
        },
        {
          "heading": "Ticker search",
          "level": 4,
          "paragraphs": [
            "Search a local symbol list by ticker, prefix, or company name before fetching data."
          ],
          "items": []
        },
        {
          "heading": "Historical market visualization",
          "level": 4,
          "paragraphs": [
            "Normalize adjusted market history and render price and sentiment charts with Plotly."
          ],
          "items": []
        },
        {
          "heading": "Feature engineering pipeline",
          "level": 4,
          "paragraphs": [
            "Derive model features from price, volume, technical indicators, news, and sentiment."
          ],
          "items": []
        },
        {
          "heading": "Directional model training",
          "level": 4,
          "paragraphs": [
            "Train XGBoost or Random Forest per ticker to estimate the next return direction."
          ],
          "items": []
        },
        {
          "heading": "Forecast disclaimer gate",
          "level": 4,
          "paragraphs": [
            "Reveal forecasts after users acknowledge their limits as directional estimates."
          ],
          "items": []
        },
        {
          "heading": "Ticker-based exploration",
          "level": 5,
          "paragraphs": [
            "Allows users to search for a stock and quickly review historical price behavior in a focused dashboard."
          ],
          "items": []
        },
        {
          "heading": "Interactive market charts",
          "level": 5,
          "paragraphs": [
            "Presents stock history through visual tools that make price movement, trend behavior, and market context easier to inspect."
          ],
          "items": []
        },
        {
          "heading": "Directional prediction output",
          "level": 5,
          "paragraphs": [
            "Tests whether historical and sentiment-derived signals can support a next-day up-or-down prediction."
          ],
          "items": []
        },
        {
          "heading": "Model transparency",
          "level": 5,
          "paragraphs": [
            "Surfaces prediction limitations and confidence context so the output is treated as an experiment rather than investment certainty."
          ],
          "items": []
        },
        {
          "heading": "Exploratory MVP scope",
          "level": 5,
          "paragraphs": [
            "Demonstrates how a focused analytics experiment can be scoped around one constrained question instead of expanding into a full trading platform."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Ticker search",
          "level": 6,
          "paragraphs": [
            "Uses a local ticker CSV loaded into process memory to search by exact symbol, ticker prefix, or company-name substring before loading dashboard data."
          ],
          "items": []
        },
        {
          "heading": "Historical market visualization",
          "level": 6,
          "paragraphs": [
            "Fetches daily adjusted aggregate data from Massive.com, normalizes it into OHLCV records, and renders interactive line, candlestick, and sentiment-overlay charts through Plotly."
          ],
          "items": []
        },
        {
          "heading": "Feature engineering pipeline",
          "level": 6,
          "paragraphs": [
            "Builds model inputs from returns, lagged returns, RSI, relative volume, price and volume z-scores, volatility, OBV, VWAP divergence, benchmark-relative strength, sentiment, and news volume."
          ],
          "items": []
        },
        {
          "heading": "Directional model training",
          "level": 6,
          "paragraphs": [
            "Trains ticker-specific XGBoost or Random Forest classifiers on request to estimate whether the next daily return is positive."
          ],
          "items": []
        },
        {
          "heading": "Forecast disclaimer gate",
          "level": 6,
          "paragraphs": [
            "Keeps forecast output blurred until the user acknowledges that predictions are directional estimates and not financial advice."
          ],
          "items": []
        },
        {
          "heading": "Applied skills",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Machine learning",
            "Time series analysis",
            "Data visualization",
            "Model evaluation",
            "Feature engineering"
          ]
        },
        {
          "heading": "Tech stack",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Python",
            "Dash",
            "Plotly",
            "XGBoost",
            "Random Forest",
            "VADER",
            "Massive.com"
          ]
        },
        {
          "heading": "Have a related challenge? Let’s talk about it.",
          "level": 2,
          "paragraphs": [
            "Bring an idea, a workflow to improve, or a technical question. We can work through what comes next."
          ],
          "items": []
        }
      ]
    },
    {
      "url": "https://www.dontaiwilson.com/projects/Simply-Sudoku",
      "title": "Simply Sudoku - Dontai Wilson",
      "description": "Native Android Sudoku app built as a Kotlin learning project around puzzle generation, board state, and responsive gameplay.",
      "heading": "Simply Sudoku",
      "sections": [
        {
          "heading": "Simply Sudoku",
          "level": 1,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "A familiar puzzle. Built from the rules up.",
          "level": 2,
          "paragraphs": [
            "A native Android learning project exploring puzzle generation, game state, and responsive interaction in Kotlin."
          ],
          "items": [
            "Platform",
            "Mobile App",
            "Scope",
            "Full-stack",
            "Team",
            "Solo",
            "Status",
            "Complete",
            "Started",
            "Jun 15, 2024"
          ]
        },
        {
          "heading": "Project context",
          "level": 2,
          "paragraphs": [
            "Sudoku has been one of my favorite puzzle games since middle school, so when I began learning Kotlin and Android development, it felt like a natural project to build from scratch.",
            "The goal was not to reinvent the game or turn it into something overly complex. I wanted to create a clean, familiar Sudoku experience while using the project to practice algorithm design, state management, and native mobile development."
          ],
          "items": []
        },
        {
          "heading": "The challenge",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Generate valid puzzles from scratch",
            "Keep the board synchronized with game rules"
          ]
        },
        {
          "heading": "The approach",
          "level": 2,
          "paragraphs": [],
          "items": [
            "One game model owns state and moves",
            "Native views render the current board"
          ]
        },
        {
          "heading": "From intent to interaction",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Generate a puzzleBuild a solved grid and remove clues while checking for multiple solutions.",
            "Work through the boardSelect cells, enter values, and use hints or undo when needed.",
            "Save and returnResume a locally saved game for the selected difficulty."
          ]
        },
        {
          "heading": "What it makes possible",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Play a generated puzzle",
          "level": 3,
          "paragraphs": [
            "Start a locally generated puzzle with a checked solution."
          ],
          "items": []
        },
        {
          "heading": "Work through mistakes",
          "level": 3,
          "paragraphs": [
            "Use hints, undo, redo, and reset while solving the board."
          ],
          "items": []
        },
        {
          "heading": "Resume a saved game",
          "level": 3,
          "paragraphs": [
            "Resume saved board state and elapsed time by difficulty."
          ],
          "items": []
        },
        {
          "heading": "How the pieces fit",
          "level": 2,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Android screens",
          "level": 3,
          "paragraphs": [
            "Render the board and respond to player input."
          ],
          "items": []
        },
        {
          "heading": "Shared game state",
          "level": 3,
          "paragraphs": [
            "Manage puzzles, move history, and validation."
          ],
          "items": []
        },
        {
          "heading": "Local save slots",
          "level": 3,
          "paragraphs": [
            "Save board state and elapsed time by difficulty."
          ],
          "items": []
        },
        {
          "heading": "One owner for game logic",
          "level": 3,
          "paragraphs": [
            "Keep board updates and gameplay tools connected to one game model."
          ],
          "items": []
        },
        {
          "heading": "Keep computation off the interaction path",
          "level": 3,
          "paragraphs": [
            "Run heavier puzzle operations without blocking player interaction."
          ],
          "items": []
        },
        {
          "heading": "Engineering notebook",
          "level": 2,
          "paragraphs": [
            "Explore the design, data flow, and implementation in more detail."
          ],
          "items": []
        },
        {
          "heading": "Android screens",
          "level": 4,
          "paragraphs": [
            "Render the board and respond to player input."
          ],
          "items": []
        },
        {
          "heading": "Shared game state",
          "level": 4,
          "paragraphs": [
            "Manage puzzles, move history, and validation."
          ],
          "items": []
        },
        {
          "heading": "Local save slots",
          "level": 4,
          "paragraphs": [
            "Save board state and elapsed time by difficulty.",
            "Simply Sudoku was built as a personal learning project around a game I already enjoyed playing.",
            "The project gave me a focused way to practice Kotlin, Android development, recursive problem solving, and gameplay state management without hiding behind a prebuilt game engine. Because Sudoku is deterministic and rule-driven, it provided a clear environment for learning how to represent a board, validate moves, manage player interaction, and keep the interface synchronized with the underlying game state."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "Simply Sudoku is built as a native Android application in Kotlin using AppCompat fragments, XML layouts, traditional Views, and an activity-scoped MainViewModel.",
            "The app centers around a single GameLogic instance owned by the ViewModel. GameLogic handles puzzle generation, board mutation, validation against the solved grid, hints, undo/redo, reset, completion checks, and save-state serialization, while fragments observe LiveData and refresh the board UI."
          ],
          "items": []
        },
        {
          "heading": "Generate a puzzle",
          "level": 4,
          "paragraphs": [
            "Generate a board with a checked unique solution."
          ],
          "items": []
        },
        {
          "heading": "Work through the board",
          "level": 4,
          "paragraphs": [
            "Enter values and use hints or undo when needed."
          ],
          "items": []
        },
        {
          "heading": "Save and return",
          "level": 4,
          "paragraphs": [
            "Resume the saved game for the chosen difficulty.",
            "Users open the app, start a Sudoku puzzle, select cells, enter values, and work through the board using a familiar mobile puzzle interface.",
            "The experience is intentionally simple. The app is meant to feel like Sudoku: clear, focused, and consistent, without unnecessary layers getting in the way of solving the puzzle."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "A puzzle begins inside GameLogic, which creates a solved 9x9 grid by randomizing diagonal boxes and completing the board with recursive backtracking. It then removes clues while rejecting removals that would produce multiple solutions.",
            "The board is represented through parallel grids for the solved puzzle, initial givens, current player-visible state, and cell color classification. When a user enters a value, the ViewModel routes the update into GameLogic, records the move in undo history, recalculates correctness against the solved grid, and republishes board state through LiveData for the fragment to render."
          ],
          "items": []
        },
        {
          "heading": "Generate a unique puzzle",
          "level": 4,
          "paragraphs": [
            "Reject clue removals that allow multiple solutions."
          ],
          "items": []
        },
        {
          "heading": "Keep separate board grids",
          "level": 4,
          "paragraphs": [
            "Track solved, initial, current, and color grids."
          ],
          "items": []
        },
        {
          "heading": "Save one game per difficulty",
          "level": 4,
          "paragraphs": [
            "Save board state and elapsed time by difficulty.",
            "Simply Sudoku is built around the gameplay loop that makes Sudoku work: board state, valid moves, puzzle solving, and responsive interaction.",
            "The most interesting part of the project was not adding extra features, but coordinating the backtracking logic, game state, and Android UI so the app remained responsive while puzzle operations were processed. Working through that helped me better understand how coroutines can keep computation-heavy logic from blocking the user experience."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [
            "Navigation is handled through fragment replacement inside a single FragmentContainerView, with LandingFragment, GameFragment, and ThemeFragment forming the main screens. The game board is rendered as 81 TextView cells inside a ConstraintLayout, with larger margins marking 3x3 box boundaries.",
            "Persistence uses SharedPreferences save slots for Easy, Medium, and Hard games. Each slot stores the initial board, solved board, current user board, color grid, and elapsed time. The implementation favors a simple local architecture over accounts, remote sync, databases, or a game engine."
          ],
          "items": []
        },
        {
          "heading": "Generated puzzles",
          "level": 4,
          "paragraphs": [
            "Generate a solved board, then remove clues while checking for multiple solutions."
          ],
          "items": []
        },
        {
          "heading": "Board state model",
          "level": 4,
          "paragraphs": [
            "Keep solution, givens, player entries, and cell colors together inside GameLogic."
          ],
          "items": []
        },
        {
          "heading": "Move validation",
          "level": 4,
          "paragraphs": [
            "Compare player input with the solution and reveal mistakes through Show mode."
          ],
          "items": []
        },
        {
          "heading": "Hints and correction tools",
          "level": 4,
          "paragraphs": [
            "Support solved-cell hints, reset, clear mistakes, and in-memory undo and redo."
          ],
          "items": []
        },
        {
          "heading": "Local save slots",
          "level": 4,
          "paragraphs": [
            "Store one game per difficulty in SharedPreferences, including grids and elapsed time."
          ],
          "items": []
        },
        {
          "heading": "Classic Sudoku gameplay",
          "level": 5,
          "paragraphs": [
            "Provides a familiar Sudoku experience centered on solving a clean, rule-driven puzzle board."
          ],
          "items": []
        },
        {
          "heading": "Board interaction",
          "level": 5,
          "paragraphs": [
            "Allows users to select cells, enter values, and progress through the puzzle using a simple mobile interface."
          ],
          "items": []
        },
        {
          "heading": "Puzzle validation",
          "level": 5,
          "paragraphs": [
            "Uses Sudoku rules to keep gameplay grounded in row, column, and box constraints."
          ],
          "items": []
        },
        {
          "heading": "Solver-backed logic",
          "level": 5,
          "paragraphs": [
            "Uses backtracking logic to support the puzzle system and reinforce the deterministic rules behind the game."
          ],
          "items": []
        },
        {
          "heading": "Responsive gameplay",
          "level": 5,
          "paragraphs": [
            "Uses asynchronous processing patterns so puzzle logic can run without making the interface feel blocked or sluggish."
          ],
          "items": []
        },
        {
          "heading": "Implementation",
          "level": 5,
          "paragraphs": [],
          "items": []
        },
        {
          "heading": "Generated puzzles",
          "level": 6,
          "paragraphs": [
            "Creates puzzles locally by seeding randomized diagonal 3x3 boxes, completing the board with recursive backtracking, and removing clues while checking for multiple solutions."
          ],
          "items": []
        },
        {
          "heading": "Board state model",
          "level": 6,
          "paragraphs": [
            "Tracks the solved board, original givens, current user entries, and cell color state through parallel 9x9 grids managed by GameLogic."
          ],
          "items": []
        },
        {
          "heading": "Move validation",
          "level": 6,
          "paragraphs": [
            "Compares user-entered values directly against the generated solution and uses Show mode to reveal correct, incorrect, and hinted cells."
          ],
          "items": []
        },
        {
          "heading": "Hints and correction tools",
          "level": 6,
          "paragraphs": [
            "Supports random solved-cell hints, clear-mistakes behavior, reset, and in-memory undo/redo stacks for player actions."
          ],
          "items": []
        },
        {
          "heading": "Local save slots",
          "level": 6,
          "paragraphs": [
            "Stores one resumable game per difficulty in SharedPreferences, including board grids and elapsed time."
          ],
          "items": []
        },
        {
          "heading": "Applied skills",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Algorithm design",
            "Constraint solving",
            "State management",
            "UI engineering"
          ]
        },
        {
          "heading": "Tech stack",
          "level": 2,
          "paragraphs": [],
          "items": [
            "Kotlin",
            "Android SDK"
          ]
        },
        {
          "heading": "Have a related challenge? Let’s talk about it.",
          "level": 2,
          "paragraphs": [
            "Bring an idea, a workflow to improve, or a technical question. We can work through what comes next."
          ],
          "items": []
        }
      ]
    }
  ]
}
