Skip to content
← IndexWork / 2025 — now

Nora

An AI personal assistant that reads across 40+ apps — mail, messages, calendar, tasks, health — and returns one ordered surface instead of forty notification badges. Daily routines summarise what happened, detect what needs a decision, and surface only that.

Activenoraai.co
Role
Founder · Design & front-end
Year
2025 — now
Stack
React Native, Next.js, TypeScript, AI Agents

The problem

Modern work is spread across forty places at once. Mail in two inboxes, decisions in Slack, commitments in WhatsApp, tasks in Linear, the actual day in a calendar nobody reads until it fires a notification. Nothing is missing, exactly — it is just distributed past the point where any person can hold it.

The usual answer is another dashboard. That fails for a simple reason: a dashboard shows you everything, and everything is the problem.

The approach

Nora reads across the services you already use — Gmail, Outlook, WhatsApp, Slack, Google Calendar, Notion, Linear, GitHub, Figma, and more than forty others — and returns one ordered surface. Not a mirror of your inboxes. A filter over them.

  • Routines run on a schedule and summarise what happened, what needs a decision, and what is about to.
  • Event detection pulls real commitments out of conversations, so a plan agreed in a message thread becomes something the system knows about.
  • Voice capture takes notes through meetings, calls and classes.
  • Transactions and wellness fold spending and sleep into the same picture, because they are part of the day too.

My part

I am the founder, and I do three jobs.

I lead the company and make the calls. I design and build the front-end across mobile, web and the commercial surfaces. And I own distribution — I am the direct line to both customers and investors.

The front-end is where the product actually lives. An assistant that filters has to feel like it is on your side, and that feeling is made almost entirely out of interface decisions: what gets shown first, how much is hidden, how quickly it responds, whether the thing you needed is already on screen when you open it.

What I would tell you over coffee

The hard part was never the integrations. It was deciding what not to show. Every integration makes the filter harder, not easier — more sources means more noise to reject, and rejecting the wrong thing is worse than showing too much.

From the source
routines/morning-digest.ts
/** A routine is a filter, not an inbox. */
export const morningDigest = defineRoutine({
  id: "morning-digest",
  runAt: { hour: 7, tz: "America/Sao_Paulo" },
  sources: ["gmail", "whatsapp", "slack"],

  async run({ since, sources, llm }) {
    const all = await sources.collect(since);

    // Everything arrives. Almost nothing
    // survives this next line.
    const salient = all.filter(
      (e) => e.score >= THRESHOLD,
    );

    return llm.summarise(salient, {
      voice: "direct",
      maxItems: 7,
      groupBy: "decision-needed",
    });
  },
});