Kestow

Kestow is a home maintenance tracker built for families. It serves as institutional memory for a house: a single place to record maintenance tasks, equipment, service providers, procedures, documents, and costs. The goal is to turn fragmented home knowledge (scattered across email, receipts, and memory) into a permanent, queryable record.

Why it exists

Every homeowner accumulates knowledge about their house that lives nowhere durable. When was the water heater last serviced? What paint color is in the hallway? Who did the roof repair and how much did it cost? The answers are usually buried in email threads, scribbled on receipts, or stored in someone’s head. Kestow replaces that with a system designed for the long term.

The app is built around a few principles: low friction over completeness (nothing is required except a completion timestamp), institutional memory over to-do list (the value compounds over years, not days), and privacy first (no analytics, no telemetry, no external data sharing).

How it was built

Kestow was built entirely with Claude Code. The v1.0 MVP shipped in six days across 306 commits and nine phases of planned development, totaling roughly 24,000 lines of TypeScript. A v1.1 simplification milestone followed two days later with another 142 commits, refining the UX and adding features like procedures and WebAuthn.

The development used a structured planning workflow: each milestone was broken into numbered phases with requirements, and each phase had its own plan, execution, and verification cycle. A CLAUDE.md file in the repository captured architecture decisions and conventions so each session could pick up where the last left off.

How it works

Assets and organization

The foundation of Kestow is the asset: any piece of equipment or system in the home worth tracking. Each asset has a detail page that serves as a hub, with linked procedures, tasks, files, costs, provider history, and technical specs all in one place. Assets are organized with user-defined categories (with fuzzy-match inline creation) and lightweight location tags like Kitchen, Under Sink, or Master Bedroom.

Tasks and recurrence

Tasks are the core daily interaction. They support four recurrence types: fixed interval (every N days, weeks, months, or years), seasonal (spring, summer, fall, or winter), calendar date (e.g., November 1 annually), and one-off.

When a recurring task is completed late (more than 10% past its interval), the system detects cycle drift and prompts the user to choose: maintain the original rhythm, adopt the actual interval going forward, or revert to the original schedule. This prevents schedules from silently shifting over time.

Tasks can also have a lead time. If a task has lead_time_days set, the dashboard will prompt “Schedule now” when the lead time window opens, giving time to book a contractor or order parts before the work is actually due.

Completion flow

Marking a task done is deliberately low-friction. A single tap records the completion with a timestamp. But optional follow-up fields surface progressively afterward: provider, cost (with parts/labor breakdown), notes, photos, and follow-up actions. Nothing beyond the timestamp is required, so quick tasks stay quick while bigger jobs can capture full detail.

Procedures

Procedures are ordered, stepwise checklists that can be linked to tasks or used standalone. Each step tracks Done or Skipped status, and the system remembers which steps get routinely skipped. Users can complete steps in any order during execution. Procedures support the same seasonal recurrence as tasks.

Cost tracking

Costs are captured optionally at task completion, with an optional parts/labor breakdown. The cost dashboard uses Recharts to visualize spending by category, provider, and asset over configurable date ranges. A spike detector flags when spending in a category or with a provider exceeds 1.5x its trailing twelve-month average.

Document analysis

Uploaded files (PDFs, photos, receipts) are automatically analyzed by Claude Haiku’s vision capabilities. The system extracts structured data: invoice line items, warranty dates, model numbers, and maintenance records. For product manuals, the system goes further: it strips front matter, chunks the text into 500-1000 character segments, embeds each chunk with Voyage AI (1024-dimension vectors), and indexes them for vector search.

File uploads use a three-step flow: the browser requests a presigned URL from Backblaze B2, uploads directly to B2 (never routing through the server), then confirms the upload to trigger HEIC-to-JPEG conversion, thumbnail generation, and AI analysis queuing. A GitHub Actions cron job processes the analysis queue every five minutes.

AI-powered querying

All of this data (tasks, assets, costs, documents) feeds into a natural language query interface. The pipeline works in two stages. First, the user’s question is sent to Claude Haiku along with the database schema, and Haiku generates a SQL query. The SQL executes via a Supabase stored procedure (execute_readonly_query) that enforces SELECT-only access, scopes results to the user’s home, and applies a five-second timeout.

If the question requires document context (e.g., “what does the manual say about filter replacement?”), Haiku sets a retrieve_documents flag. The system then embeds the question using Voyage AI, performs a cosine similarity search against the indexed document chunks, and sends the top five results back to Haiku for synthesis. Answers include source citations so the user can verify.

The query interface is rate-limited to 50 interactions per user per day.

Access and permissions

Kestow is designed for families. An owner generates shareable invite links, and members join with one of three permission levels: Owner (full admin including home settings and member management), Editor (read/write but no admin), or Viewer (read-only, including cost reports and the query interface). Authentication uses Supabase Auth with email/password, plus optional WebAuthn passkeys for biometric login via Face ID or Touch ID.

All users must acknowledge an AI data processing disclosure before accessing home data.

Stack

Next.js 16 App Router, React 19, TypeScript, Supabase (PostgreSQL with pgvector and row-level security), shadcn/ui, Tailwind CSS 4, Backblaze B2 for file storage, Claude Haiku 4.5 for AI analysis and querying, Voyage AI for embeddings, WebAuthn passkey auth. Deployed on Vercel. Source not yet public.