-
-
Peyk - Reads everything, knocks only when it matters.
-
246 unread, one knock: a SEV-1 alert clears the interruption budget while everything else waits for the morning brief.
-
No commands — say hi, then just ask. Peyk answers with a quick reflex, then real facts from your inbox.
-
Every outgoing reply is a draft: ✅ Send · ✏️ Edit · ❌ Cancel. Nothing leaves until you tap Send.
-
Tell it once, it remembers — and forgets everything the moment you ask it to delete your account.
Inspiration
A phone buzzes sixty times a day and every buzz looks the same: a newsletter, a receipt and a client whose checkout is down all get the same red badge. The assistants that could help all wait to be asked. We wanted the opposite: an agent that reads everything, knocks only for what matters, and never speaks for you without a nod, like a good secretary. Peyk is Turkish for the palace courier who carried only what mattered. It also means satellite, which became the logo.
What it does
You talk to Peyk on Telegram. Say hi, answer one question, tap a login link. There are no commands.
- Watches Gmail, Google Calendar and your Notion, Google Docs and Drive documents.
- Rates every mail and event with Claude Haiku 4.5: urgency 1–5 and a one-line summary in your language.
- Spends an interruption budget. A pure function decides whether to knock, not the model: a daily quota of 5 with 2 slots kept for emergencies, a per-thread cooldown, quiet hours and mutes. A 👎 gives the slot back, and anything found hours late waits for the 08:00 brief. Sixty mails a day become three or four knocks.
- Checks your calendar before it tells you. "Can we meet tomorrow at 1 pm?" arrives with what it clashes with, free alternatives and a reply draft. Times follow where you are now, not where your calendar was set up.
- Talks like a secretary (Claude Sonnet 4.6 with tools): a quick first reflex, then an answer from your real data. Voice notes and photos become text, and it can read the public web.
- Drafts, you decide. Anything that reaches another person, like a mail or an invitation, is a card: ✅ Send · ✏️ Edit · ❌ Cancel. The approval carries a hash of what you saw, so an old Send button can never send an edited draft, and only the card's owner can press it.
- Learns with consent. After a service connects, it reads 30 days of metadata only (senders, subjects, titles, never bodies). It says what it noticed and stores nothing until you confirm.
- Yours to delete. "Delete my account" asks twice, then revokes the connections and erases everything.
How we built it
- Strands Agents SDK on Amazon Bedrock. Four agents share one package: triage and the chat reflex (Claude Haiku 4.5, structured output), chat and learning (Claude Sonnet 4.6). Memory uses Titan Embeddings v2 with pgvector. Voice notes use Mistral Voxtral on Bedrock.
- The agent package never touches the database. Tools return data or intents (reminder, memory, draft, connect, delete), and the workers apply the side effects. That keeps it deployable to Bedrock AgentCore Runtime (CodeZip configuration in
agentcore/). - Postgres is the queue. Every input becomes one observation row keyed by its natural id: a mail, an event, a Telegram message or a scheduler tick. Three consumers take rows with
FOR UPDATE SKIP LOCKEDand keep each person's messages in order. Replays and reconciles are safe by construction. - Composio handles OAuth, triggers and actions for Gmail, Calendar, Notion, Drive and Docs. Adding Google Calendar took one mapping row, and a test enforces that the core stays untouched.
- Production is one container on Fly.io with Neon Postgres, and the models run on Bedrock. 177 tests, with phase gates tagged in git.
Challenges we ran into
- Our AWS account could not run AWS compute. The organization's service control policies deny AgentCore, CloudFormation, ECR, EC2/ECS/Lightsail and Transcribe streaming. We kept the agent package AgentCore-ready and run the workers on Fly.io. Speech-to-text moved to Mistral Voxtral on Bedrock, which transcribes a Turkish voice note in about 1.5 s.
- Triggers are not a stream. We measured about 49 s of trigger latency, saw that a disabled trigger silently loses events, and found that about 40% of one tester's mails never fired a trigger. A reconcile job backfills every 10 minutes, and deduplication by natural key keeps it idempotent.
- A budget is easy to burn. A replay of 60 labelled mails showed morning urgency-3/4 pings starving an afternoon emergency, which is why the reserve exists. Then a friend's first 20 minutes used all three ordinary slots on a "you granted access" alert and an 8-hour-old mail, and ten real meeting mails stayed silent for a day. Now anything found hours late waits for the brief, and 👎 returns the slot.
- Time zones. The same friend lives in Berlin but was travelling in Turkey. Peyk said "you're free at 13:00" over a lunch that was at 13:00 Turkish time. Times now follow where the person is, and "I'm in Istanbul" moves the zone within the same turn.
- Model habits. Sonnet called the same not-yet-loaded tool up to seven times per round and told people their calendar "was not responding". We reworded the tool note to "do not call it again now; end this turn with one short line". Repeats dropped from 10 of 14 real-model runs to 0, and rounds went from 12–20 s to about 4 s.
Accomplishments that we're proud of
- It is live and multi-user from day one, and it answers in the language you write in.
- The decision to interrupt is a pure, tested function, so you can always see why Peyk stayed quiet. Ask it "why didn't you tell me?" and it answers.
What we learned
- Let the model judge importance, but never let it decide on its own to interrupt.
- Real people break a design in their first 20 minutes. Tracing their real data found our bugs faster than guessing did.
- In a tool-using agent, the wording of a tool result is part of the control flow.
What's next
WhatsApp as a second channel (the control layer is already an adapter), Slack and Outlook as sources, AgentCore Runtime on an unrestricted account, and learning from 👍/👎.
Built With
- amazon-bedrock
- amazon-titan-embeddings
- claude-haiku-4.5
- claude-sonnet-4.6
- composio
- docker
- fastapi
- fly.io
- github
- gmail-api
- google-calendar-api
- google-docs
- google-drive
- httpx
- mistral-voxtral
- neon
- notion
- pgvector
- postgresql
- pydantic
- pytest
- python
- strands-agents
- telegram-bot-api
- uv

Log in or sign up for Devpost to join the conversation.