Verification

Every claim on this site, checked against the code

We don't just promise things about how Taggard works — we trace each claim to the exact file, function, or query that has to be true for it to hold, and publish the result below.

38Claims traced
36Verified
2Not verifiable
0False

Last checked 2026-09-03 — re-audited after every copy change, twelve passes since launch

HOMEPAGE

What the homepage claims

Verified

Dual tagging

Every note gets two kinds of tags — Taggard suggests both: one set styled for browsing, yours to accept or reject, and a hidden layer for deep, cross-referenced recall.

src/lib/ai/tagger.ts · src/lib/process.ts
Verified

Entity resolution

People, organizations, places, and products — recognized and matched across every note.

Exact match to the extractor's type enum — no more, no fewer.

src/lib/ai/entityExtractor.ts
Verified

Cross-references, not manual backlinks

Taggard finds when one note builds on, contradicts, cites, or overlaps in topic with another — automatically, not a backlink you draw yourself like in Notion or Obsidian — and shows the exact passages that triggered it.

No manual-create path exists anywhere in the codebase for a cross-reference row.

src/lib/ai/crossRefs.ts · RelationshipKindSchema
Verified

Ask, with citations

Get an answer built from across your notes — including ones connected by meaning, not just keywords — with sources cited.

src/lib/ai/ask.ts · fetchGraphExpansion()
Verified

Idea evolution

Pick a topic and see it as a timeline: which note built on which, where you changed your mind, and when.

src/app/evolution/page.tsx
Verified

Theme discovery

Notes that share a latent pattern get clustered automatically, and Taggard can name what connects them.

Real union-find clustering over shared hidden tags — not a frequency count.

src/lib/themeClustering.ts
Verified

Knowledge graph

Every note and connection, visualized. Click a dot, follow a line.

src/components/Graph.tsx
Verified

Dedicated schema per extraction step

Every extraction step... is a dedicated model call with its own schema, not one prompt doing everything.

tagger.ts · entityExtractor.ts · crossRefs.ts · themeNamer.ts
Verified

Schema-constrained, except where it shouldn't be

GPT-class models handle tagging, entity extraction, cross-reference classification, and theme naming as separate, schema-constrained calls — plus a free-form call for Ask's actual answers.

src/lib/ai/ask.ts
Verified

Vector search

Every note, chunk, tag, and entity gets an embedding. Postgres + pgvector (HNSW-indexed).

scripts/init.sql
Verified

Canonicalization

New tags and entities are matched against existing ones by embedding distance before creating a duplicate — close variants merge automatically, and near-misses are flagged in your Insights digest instead of silently piling up.

src/lib/process.ts · src/lib/consolidate.ts
Verified

Architecture

Server-rendered throughout, backed by hosted Postgres (Supabase) with Prisma. No separate vector database to keep in sync.

prisma/schema.prisma · src/lib/prisma.ts
Verified

Row-Level Security on reads

Reads are enforced with Row-Level Security at the database itself — so Postgres refuses to return another account's rows even if the app had a bug.

src/lib/prisma.ts · withUserScope()
Verified

Full export

Export your full knowledge base as JSON or CSV whenever you want.

Genuinely full — entities and incoming connections included.

src/app/api/export/route.ts
Verified

A layer, not a new place to write

Taggard sits underneath whatever you already use to capture notes.

src/components/UploadDropzone.tsx
Verified

What you can actually upload

Drop a document (.txt, .md, .pdf, .docx) or paste text directly.

accept=".txt,.md,.pdf,.docx,..."
Verified

Accept/reject sharpens future tagging

Taggard suggests visible tags and a hidden layer underneath. Accept what's right, reject what's not — every call sharpens what it suggests next time.

src/lib/ai/tagger.ts · src/lib/process.ts:61-77
Verified

Automatic cross-checking, not just keywords

Entities get resolved and the note is automatically checked against everything else you've written — not just for shared keywords.

src/lib/ai/entityExtractor.ts · src/lib/ai/crossRefs.ts
Verified

The graph illustration is the real graph

This is the same graph you can click through on the Graph page.

The homepage illustration imports the real KIND_COLORS/KIND_LABELS rather than hardcoding them.

src/lib/ai/ask.ts · src/components/Graph.tsx · src/lib/crossRefKinds.ts
Verified

Visible tags are suggestions, not your writing

Visible tags are Taggard's suggestions, styled the way you'd tag something yourself — a name, a project, a date — and yours to accept or reject.

src/lib/ai/tagger.ts
Verified

Try it now, no account needed

Try it now — no account needed.

Every page resolves to a real session or a persistent guest identity and never redirects to /login.

src/lib/auth.ts · resolvePageUserId() · src/app/dashboard/page.tsx
SECURITY PAGE

What the security page claims

Verified

Passwords never stored in the clear

We can never see your password. It's hashed with bcrypt before it ever touches the database — not even to help you if you forget it.

src/lib/auth.ts · bcrypt.hash(..., 10)
Verified

Row-Level Security, enforced by Postgres

Every read runs through a restricted Postgres role — Postgres itself refuses to return another account's rows, independent of whatever the application code does.

Proven with direct SQL as the restricted role — no session variable, no WHERE clause — 0 rows.

src/lib/prisma.ts · withUserScope()
Verified

Encrypted in transit and at rest

Your database connection is TLS-encrypted in transit, and your data is stored on infrastructure that encrypts at rest by default.

Standard, documented Supabase platform behavior.

Supabase platform default
Verified

Hidden tags stay internal

The hidden-tag layer is used internally for retrieval — it's not surfaced to other users or any third party, because there are no other users with access to your data at all.

src/lib/ai/tagger.ts
Verified

One AI processor, disclosed

Every note passes through OpenAI's API to generate tags, entities, and connections... Nobody else — no marketer, no ad network, no data broker — ever sees it.

src/app/security/page.tsx
Verified

Export lives in the header, not buried

Download every note, tag, entity, and connection as JSON or CSV whenever you want — the Export link is in the header on every page.

src/app/api/export/route.ts · src/components/Header.tsx
Verified

You control deletion

Delete any note, folder, tag, or entity permanently at any time from the app itself — no support ticket required.

/api/notes/[id] · /tags/[id] · /entities/[id] · /folders/[id]
Verified

Roadmap phases labeled honestly

Phase 2 — on-device embeddings. Phase 3 — fully offline desktop app.

Both correctly labeled as not-yet-built.

src/app/security/page.tsx
Verified

Never shared with marketers or brokers

Share your content with marketers, advertisers, or data brokers.

Narrowed from an unqualified "third parties," which technically included the disclosed OpenAI dependency above.

src/app/security/page.tsx
Not code-verifiable

Never sell or train on your data

Sell your data. Train AI models on your documents.

A business commitment, not a mechanism — graded on whether the code contradicts it. It doesn't: zero analytics or ad-tech dependencies exist anywhere in the app.

package.json
Verified

No lock-in

Lock you in — export everything, any time.

Same export fix as above — now genuinely everything.

src/app/api/export/route.ts
FAQ

What the FAQ claims

Verified

Doesn't replace your note app

No — it's the layer underneath, not a new place to write. Keep using whatever you already capture notes in.

Tag-only browsing works without engaging any of the AI layer.

src/app/dashboard/page.tsx
Verified

Isolated at the database level

It's isolated at the database level today via Row-Level Security.

src/lib/prisma.ts
Not code-verifiable

Never sold, never used to train

Taggard never sells your data and never trains models on it.

package.json
Verified

Hidden vs. visible tags

Hidden tags are a second layer Taggard builds automatically... powering cross-reference detection and theme clustering.

src/lib/ai/tagger.ts · src/lib/themeClustering.ts
Verified

Browsable without the AI layer

Visible tags are always there to filter by; the hidden layer runs underneath without changing how you search when you don't need it.

Confirmed pure Prisma filtering — zero AI or embedding calls on this path.

src/app/dashboard/page.tsx
Verified

Notion/Obsidian, compared honestly

Taggard's connections are found automatically — every note is checked against everything else you've written for five kinds of relationship, including contradictions.

src/lib/ai/crossRefs.ts · fetchVectorCandidates() · fetchHiddenTagCandidates()

Read every claim. Judge for yourself.

No claim ships without a file to back it up — and every audit pass, including the ones that found something wrong, stays on the record.