-
-
The dashboard. Everything that needs me today, including a promise that's slipping because the letter it depends on is now late.
-
Open any loop to see what it depends on and the exact words it came from.
-
I just tell it what's going on. It works out who I owe, who owes me, and what's waiting on what.
-
A test scam message checked: critical risk, with a source behind every finding.
-
The evidence behind the verdict. Bank Negara's alert list and the company's real website, found on the live web.
Inspiration
Most of what slips isn't written down. "Sarah said she'll get back to me Friday." "I promised Aina I'd return her charger." "I'll send the application once Dr. Lim sends my letter." Notes apps keep what you typed, and chatbots forget it by the next session. And some messages that ask you to act aren't from who they claim: a "bank" asking you to verify your account, a fund promising 12% a month. We wanted one personal AI that holds both kinds of open loop for you: what you owe, and who's asking you to pay.
What it does
Troth pulls open loops out of normal conversation (tasks, promises you made, things you're waiting on, deadlines) and keeps them, with the exact words each came from, until they're done.
- Capture. Talk to it in the dashboard or on Telegram, paste a chat, or let it read email from people you're waiting on. Mail from someone new only becomes a suggestion you Add or Ignore.
- Remember. Goals, loops, people and history live in one database. Every loop shows why Troth knows this: the sentence it came from.
- What it depends on. "I can only send the application once Dr. Lim sends my letter" links the two. When Dr. Lim's email moves the letter past your deadline, fixed rules in code flag the promise at risk, say why, and work out your options: ask Dr. Lim, tell Sarah early, or move your date.
- Check who's asking. When a loop asks you to pay or share details, ScamGraph researches the sender on the live web (Tavily): regulator alert lists and the company's real website. Fixed rules, not the model, set the risk level, and every finding links to its source.
- Remind. Needs attention and an 8:00 Telegram briefing list what's overdue, at risk, due soon, stalled or risky.
- Your yes first. Gmail drafts and calendar events wait for your OK. Troth never sends anything.
How we built it
- Hermes Agent is the assistant: dashboard chat, Telegram, cron jobs, and two skills (
/check,/briefing). It calls Troth through 18 MCP tools and has nothing else: no terminal, files or browser. - NVIDIA Nemotron on Nebius Token Factory makes every model call. Nemotron 3.5 Super VL runs the agent, loop extraction and screenshot reading; Nemotron 3 Super runs ScamGraph's extraction, research plan, page checks and summary, where we measured it 1.8x faster than 3.5.
- Tavily Search and Extract gather the evidence. Our server never opens a suspicious link itself.
- Troth itself is Python and FastAPI with a React dashboard. The model proposes; code decides. Pydantic validates every reply, quotes must appear word for word in the input, due dates must fall on the weekday the quote names, and risk levels come from fixed rules.
- It runs on a small GCP VM behind a password, deployed by CI, with Gmail and Calendar connected to a demo account.
Challenges we ran into
- Trusting the model's output. Emails and web pages are untrusted text. We measured prompt injection on held-out AgentDojo attacks: a new email task with a link, an address or a money ask now waits for a yes, and changes made without asking fell from 10% to 3% of 42 attacks.
- Dates. "Pay by Thursday" sometimes got Friday. A code check that moves a date onto the weekday its quote names took 30 English and Malay items from 96% to 100% right (5 runs each).
- Latency. Nemotron reasons before it answers: about 85% of an extraction call's output is reasoning, so saving a message takes 10–20 s and a scam check 1–2 minutes. Turning reasoning off made it 8x faster but wrong, so we kept it.
Accomplishments that we're proud of
- Measured on the author's real email: on 18 held-out emails, the share handled fully right went from 19% to 52% after fixes driven by error analysis. On emails with nothing to track, no loop went straight into the list in 90 runs: mail from someone new only suggests.
- Dependencies are linked only when stated: 8 of 8 runs linked "I can only send it once Dr. Lim sends my reference letter" the right way round, and a same-topic control made 0 false links in 8.
- The full flow runs live end to end: chat and Telegram, at-risk options from code, a calendar event and a Gmail draft after a yes, a critical-risk check with Bank Negara's alert list as the source, and an email that becomes a suggestion on Telegram.
What we learned
Let the model read and propose, and let code decide anything that matters: risk levels, dates, what counts as a quote, what waits for a yes. Measure on real messages with a held-out split, or the improvements are just tuning.
What's next for Troth
Track records per person ("Dr. Lim: 2 of 3 late"), notes on how someone likes to be written to, and more regulators beyond Malaysia's.
Built With
- caddy
- cytoscape.js
- fastapi
- gemma
- github-actions
- gmail-api
- google-calendar-api
- google-cloud
- hermes-agent
- mcp
- nebius-token-factory
- neon
- nvidia-nemotron
- postgresql
- pydantic
- pytest
- python
- react
- sqlite
- sqlmodel
- tavily
- typescript
- vite
Log in or sign up for Devpost to join the conversation.