尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Walk into every room prepared.
Atturel is a professional relationship and conversation intelligence system. It records what you learn about the people you work with, keeps that memory honest by separating what is confirmed from what is inferred, and turns it into preparation for your next important conversation.
Prepare. Remember. Follow through. Keep a conversation -- a voice note, a recording, a pasted transcript, a few typed lines -- and Atturel reads it for what you promised, what they promised, what was decided and what nobody answered. You confirm what is real; the rest is set aside. Confirmed loops live on Open Loops until you close them, decisions live on the person, and the next brief opens with what the last conversation left open. It remembers the things you say you'll do, and brings them back when they matter: one short email on days something confirmed is due, overdue or waiting on somebody.
The product answers one question:
Given who I am meeting, the context, our relationship, our history, the room, my objective and the evidence available — what should I do next?
1. Nothing is presented as fact unless it is one.
Every claim carries an evidence level and a provenance, and the two are separate axes:
| Evidence level | Means |
|---|---|
confirmed | The user stated it, or it is corroborated |
observed | Seen directly in a source or interaction |
inferred | Atturel's reasoning, labelled as such |
unknown | Deliberately surfaced. The product says what it does not know. |
| Provenance | Means |
|---|---|
records | From your records |
interactions | From previous interactions |
public_research | From public research, with a link |
assessment | From the Interaction Profile |
inference | Atturel's inference |
Collapsing these into one label would lose the thing that makes a record trustworthy: how sure and where from are different questions.
2. Memory belongs to the user.
Nothing an AI proposes enters the relationship record until a person confirms
it. Observations arrive as proposed and stay there.
npm install
cp .env.example .env.local # fill in the [CORE] values
npm run dev
You need a Supabase project. Apply supabase/migrations/*.sql in filename
order.
Everything else is optional. With no AI key, no search key, no mail provider and no Stripe account, the product still works end to end — briefs are composed deterministically from your records and the UI says so. See docs/HUMAN_ACTIONS.md for what each credential turns on.
npm run dev # development server
npm test # unit tests
npm run typecheck
npm run lint
npm run test:e2e # Playwright, needs a running server
Verify the security boundary:
psql "$DATABASE_URL" -f supabase/tests/rls-isolation.sql
Two users, isolation asserted in both directions, transaction rolled back. Safe to run anywhere.
Next.js 16 App Router · React 19 · TypeScript · Tailwind v4 · Supabase
Server Components read data; Server Actions write it. There is no API layer for the app's own use — the only route handlers are the auth callback, the Stripe webhook, and a development-only email preview.
src/
app/
(marketing)/ public pages
(auth)/ sign in, sign up, recovery
onboarding/ profile, Interaction Profile, calibration
(app)/ Today · People · Meetings · Conversations · Open Loops · Atlas · Ask Atturel · Settings
api/stripe/ the only writer of subscription state
api/conversations/transcribe audio in, words out, audio gone
api/cron/follow-through the daily digest, behind CRON_SECRET
lib/
ai/ provider abstraction, prompts, untrusted-content fencing
conversations/ processing pipeline, open-loop state, faces, read models
follow-through/ what to mail, when, and the idempotent send
assessment/ the 96-item instrument and its scoring
billing/ plans, entitlements, metering, Stripe
email/ layout primitives and transactional templates
research/ fetch, extract, resolve identity, propose memory
sources/ SSRF-hardened fetching and URL parsing
brand/ every user-visible brand string, in one file
user_id filters in
application code are defence in depth, not the mechanism. Policy helpers live
in a private schema that PostgREST does not expose.subscriptions and
entitlement_overrides are readable by their owner and writable only by the
service role.Every capability ships twice: a model prompt and a deterministic evidence composer. Which one ran is recorded on the artifact and shown in the UI. This is not a fallback bolted on — it is why the product is honest about what it knows, and why it works at all without a key.
Extraction is heavily guarded. A headline like
"Satya Nadella Once Gave Up His Green Card For Love" must not become
current_role: "Once Gave Up His Green Card". Title vocabulary gates, prose
validation, and connector restrictions exist because that exact failure happened
during development, and a confidently wrong claim about a real person is the
worst thing this product could produce.
Two first-class themes: Pearl (warm ivory, editorial) and Obsidian (graphite). Neither is the default the other degrades from. One accent family — brass — used as a marker, never as a flood fill; primary actions are high-contrast ink, which is what keeps the brass reading as precious.
The Interaction Profile is an original 96-item ipsative instrument, balanced by construction. It has not been validated against a population, and the product does not claim it has.
A visual, mobile-first layer over the same intelligence: a briefing cockpit
and room view on every brief depth, a face-first person page with a dated
relationship memory, evidence-backed Atlas connections, photo suggestions that
are never assigned without confirmation, and an Expo iPhone app (mobile/)
on the same backend. See docs/VISUAL_AND_MOBILE.md,
mobile/README.md and
docs/COMMERCIAL_READINESS.md. Review the
visuals without signing in at /dev/preview on a preview deployment.
The iPhone app's readiness, Apple compliance audit and two-minute demo are in docs/IOS_READINESS.md; the steps to the first TestFlight build are in docs/IOS_TESTFLIGHT.md.
Live at www.atturel.com. Verified 26 August 2026 by running the whole journey against production on a fresh account: signup, Interaction Profile, a person added with no URL, automatic research, footprint review, evidence inspection, first meeting, brief, debrief, memory confirmation, second meeting, second brief.
The acceptance test that mattered: the first brief said to lead with technical depth, because that is what the public record suggests. After one confirmed observation to the contrary, the second brief said to lead with business outcome and cost. Confirmed relationship evidence outranks public inference — in production, on a real person, without being told to.
Each line below was verified against production, not against a local build — the date is when it was last exercised end to end.
| Subsystem | Status | Verified |
|---|---|---|
| Supabase Custom SMTP | COMPLETE | 26 Aug 2026 |
| Resend transactional email | COMPLETE | 26 Aug 2026 |
| Signup confirmation | COMPLETE | 26 Aug 2026 |
| Password reset | COMPLETE | 26 Aug 2026 |
| Production auth redirects | COMPLETE | 26 Aug 2026 |
| Atturel domain email authentication | COMPLETE | 26 Aug 2026 |
AI reasoning (OpenAI gpt-4.1-mini) | COMPLETE | 25 Aug 2026 |
| Document and transcript ingestion | COMPLETE | 25 Aug 2026 |
| Reading a link you provide | COMPLETE | 25 Aug 2026 |
| Automatic source discovery (Exa) | COMPLETE | 26 Aug 2026 |
| Identity resolution | COMPLETE | 26 Aug 2026 |
| Public professional footprint | COMPLETE | 26 Aug 2026 |
| Evidence and provenance | COMPLETE | 26 Aug 2026 |
| Meeting preparation | COMPLETE | 26 Aug 2026 |
| Debrief and relationship memory | COMPLETE | 26 Aug 2026 |
| Ask Atturel | COMPLETE | 26 Aug 2026 |
| Pilot analytics and cost telemetry | COMPLETE | 26 Aug 2026 |
| Conversations: capture, reading, review gate | COMPLETE | 10 Sep 2026 |
| Open Loops: Done / Later / Cancel, faces, Today | COMPLETE | 10 Sep 2026 |
| Decisions on the person and in Ask | COMPLETE | 10 Sep 2026 |
| Read-only calendar (engineering) | COMPLETE | 26 Aug 2026 |
Both are built. Neither blocks a pilot.
| Calendar | Microsoft Graph and Google adapters behind one provider abstraction, encrypted tokens, 14-day idempotent sync, attendee matching, upcoming meetings on Today, Prepare from an event. Needs an Entra app registration (Microsoft) or a Cloud project plus scope verification (Google) — see HUMAN_ACTIONS §4. Read-only: Atturel never creates, edits, accepts or declines anything. |
| Billing | Checkout, portal, webhook, entitlements, metering and the founding offer, waiting only on a Stripe account. See HUMAN_ACTIONS §5. |
Alex Rivera is retained deliberately as the guided demo account. Its people,
meetings and observations are is_demo rows seeded by the in-product demo
feature, and clear_demo_data() removes them if that is ever wanted. It is not
test residue and should not be cleaned up.
Cost per unit of work is in usage_meters.estimated_cost_micros, aggregated by
the usage_cost_summary view. A measured Research Person run costs roughly
$0.012 — one Exa request plus about 10k input and 2k output tokens on
gpt-4.1-mini. Prices live in src/lib/billing/provider-cost.ts and are
estimates; update them when a vendor changes and history keeps what it actually
cost.
The funnel is in analytics_events: signup through second brief, with
timestamps, so activation, time-to-first-research, research success rate and
retention are queryable without a dashboard. Nothing there stores user content —
sanitiseProps drops anything that is not a small scalar, and logger.redact
is the equivalent backstop for logs.
Auth and email are accepted and stable. Treat that subsystem as closed:
change it for a real defect or an explicit requirement, not for tidiness. What
holds it in place is src/lib/email/send.test.ts, which pins sender
resolution, the plain-text fallback, and the two provider failures that actually
happen in production — a rejected message and a request that never completes.
ATTUREL_EMAIL_FROM / ATTUREL_EMAIL_REPLY_TO are the live variable names;
EMAIL_FROM_ADDRESS is read as an older alias.
Domain email authentication is dkim=pass [email protected] header.s=resend with SPF on send.atturel.com, for both application mail and
Supabase auth mail.
| HUMAN_ACTIONS.md | Everything that needs a person: credentials, legal, purchases, DNS |
| ARCHITECTURE.md | How the pieces fit and why |
| DATA_MODEL.md | Schema, the evidence model, workspace ownership |
| AI_ARCHITECTURE.md | Providers, prompts, the grounded composer, injection defence |
| DESIGN_SYSTEM.md | Tokens, themes, typography, the Aperture |
| PRIVACY_AND_SAFETY.md | Commitments and how each is enforced |
| TESTING.md | What is covered, and what is not |
| DEPLOYMENT.md | Getting it live |
Atturel — AT-uh-rel, from attune + relational. The name is configuration:
src/lib/brand/index.ts holds every user-visible brand string, and a test fails
the build if the name is hard-coded anywhere else.
| Since last time on the brief |
| COMPLETE |
| 10 Sep 2026 |
| Person photos, private bucket, signed at render | COMPLETE | 10 Sep 2026 |
| Daily follow-through email, idempotent, per-user day | BUILT | needs CRON_SECRET in Vercel, see HUMAN_ACTIONS §7 |