LetMeKnow

Turns messages, bills, promises and tasks into open loops, with a plan to close each one.

Open the web app (opens in a new tab)

Role
Sole developer: product research, design, TypeScript engine, React app, Supabase backend, native companions
Dates
Nov 2026 – present
Status
Web app live · new
Stack
React, TypeScript, Capacitor, Supabase · offline-first

LetMeKnow, screen by screen

  • Today. What to close now, with the week above it.

  • Capture. Paste a bill: the engine reads the amount, the due date and a time to pay it.

  • A loop. Each loop carries its next action and a plan.

  • You. Progress you can see, and settings as a few clear cards.

  • iPad. Panels dock beside the page instead of covering it.

  • Apple Watch. One big tap closes a loop, with undo.

  • Widget. The next loops on the Home Screen, never cut off.

In short

  • A pure, tested understanding engine

    Extraction, entities, repeat rules, planning and notification policy live in src/engine as pure TypeScript with no UI or storage, so every behaviour is unit-tested.

  • Extraction is not permission to interrupt

    Knowing a loop has a deadline never means notifying now: confidence bands decide whether a loop enters Today, asks first or stays searchable, and only commitments interrupt.

  • One snapshot, five surfaces

    The web app writes one compact snapshot that iOS widgets, the Apple Watch app and Android widgets all read, and it only writes when the snapshot changed.

The problem

The things people forget are rarely notes. They are promises in a chat, a bill in a photo, a missed call or a return window, scattered across apps that only store them.

  • Saving more is not the goal: a healthy list should get shorter over time, not longer.
  • A reminder app needs you to type the task and the time; most loops start as someone else’s message.
  • Treating every deadline as an alert trains people to ignore alerts.
  • Private things (bills, messages) should be understood on the device, not uploaded.

Results

tests passing across the engine and companions
42
pure engine modules
16
surfaces: web, iPhone, iPad, Apple Watch, Android
5

Measured on 9 November 2026. Native builds compile; real-device testing is still ahead.

Full engineering notes

3 sections, about 2 minutes to read

Summary

Most capture apps help you save more. LetMeKnow is built for the opposite result: fewer unfinished things. You paste a message, type a line or photograph a bill, and a pure TypeScript engine reads it into a loop: what you meant to do, for whom, by when, and the next action (reply, call, pay, decide). Each loop gets a plan, and only commitments are allowed to interrupt you; possibilities and references stay quiet. I designed and built it alone from two research reports: the engine and its tests, a hand-drawn notebook interface, offline storage, accounts and shared notes on Supabase, Google Calendar and Tasks import, and native shells for iPhone, iPad, Apple Watch and Android with widgets. The web app is live; the native apps are built but not yet in a store.

My role

What I owned

  • The product definition from two research reports: the loop model (commitment, follow-up, deadline, decision, possibility, reference) and its plans.
  • The TypeScript engine: text and OCR understanding with chrono-node, entities, repeat rules, tags, planning, notification policy, imports and exports.
  • The notebook identity: Shantell Sans and Caveat, ruled and graph paper per page, drawn icons, a checked-loop mark that draws itself, motion and haptics on every action.
  • Local-first storage in IndexedDB, Supabase accounts with row-level security, shared notes with live updates, and Google Calendar, Google Tasks and .ics import.
  • Native companions: iOS Home and Lock Screen widgets, an Apple Watch app, Android widgets, Siri, Spotlight and Control Center shortcuts, and iPad layouts with Apple Pencil pickup.

What I did not own

  • React, Dexie, chrono-node, tesseract.js, Supabase, Capacitor and the Apple and Google sign-in services it is built on.
  • No design collaborator, QA team or outside code review.
  • Widgets and the Apple Watch app are rendered from their SwiftUI views and compile; they have not yet run on a real device.

Stack and release record

  • Platforms

    Web (live), iOS and iPadOS (Capacitor 8): version 1.0.0 in internal TestFlight testing, watchOS companion: builds compile, not tested on a watch, Android (Capacitor 8): debug build and widgets compile, not in a store

  • Built with

    TypeScript, React 19, Vite, Tailwind CSS 4, Dexie (IndexedDB), chrono-node, tesseract.js (on-device OCR), Supabase (Postgres with row-level security, auth, realtime), Capacitor 8, SwiftUI, WidgetKit, WatchConnectivity, Kotlin RemoteViews widgets, Vitest, Firebase Hosting

  • Testing and delivery

    Vitest covers the engine, companion snapshots and connections (42 tests). A headless QA sweep checks overflow, clipped text, ellipses and contrast at widths from 320 to 1920 pixels and six iPad sizes, in light and dark. The web app deploys from a clean worktree of main to Firebase Hosting on the free plan.

  • Status in full

    The web app and its landing page are live on Firebase Hosting (free plan) since 9 November 2026, with Apple and Google sign-in through Supabase. iOS 1.0.0 (build 1) is in internal TestFlight testing; the Apple Watch app, widgets and Android build compile but have not been tested on real devices or submitted to a store. The source and its showcase are private for now.

Next case study Pulse A living-city simulation where about 150 residents keep living whether you watch or not.

All work and archive

Hiring interns for January 2027?

I’m available full-time from 25 January to 23 April 2027, and for graduate roles in Malaysia or overseas from August 2027. Email is the quickest way to reach me.

  • Subang Jaya, Malaysia
  • local time