The shape of it
The content of a notdocs workspace is a git repository you own. The hosted service reads and commits to it through a GitHub App, keeps an index of it for search, boards and merges, and holds the accounts, organizations, projects and tokens that decide who may do what. This page says where each of those lives and how access to them is bounded. It does not claim certifications we do not hold: there is no SOC 2 report, no ISO 27001 certificate and no penetration-test report to show yet.
Where data lives
- Application and API. Vercel, with functions running in the Stockholm region.
- Database. A managed Postgres from CapyDB. It holds accounts, organizations, projects, memberships, hashed tokens, the document index (frontmatter, search text, embeddings and chunk text) and the text of document versions used for merging.
- Uploaded assets. Vercel Blob. An uploaded file gets an unguessable address; anyone with that address can read it.
- Stream state. CapyDB K/V (Valkey) holds a pointer to a running assistant answer for at most an hour, so a reload can pick the stream back up. The answer text itself is not stored there.
- Your content. Your repository on GitHub, committed by the GitHub App. Comments are files in it. Assistant conversations are kept in your browser's local storage, not on our servers.
Data map
| What | Where | Who can read it | Deleted when |
|---|---|---|---|
| Documents and comments | Your repository on GitHub | Everyone with access to the repository | You delete them; it is your repository |
| Document index: paths, frontmatter, search text, embeddings | CapyDB Postgres | Members and guests of the project, through the API; the text of a document you share by link or publish, to anyone with its address | On request, with the project |
| Text of document versions, by content hash | CapyDB Postgres | Only the merge and read paths of the API | With the project, when no other project holds the same text |
| Accounts, organizations, memberships | CapyDB Postgres | Organization owners, through settings | On request, within 30 days |
| Agent tokens | CapyDB Postgres, hashed | Nobody; the secret is shown once | When you revoke them |
| Connected apps' OAuth tokens | CapyDB Postgres, hashed | Nobody; only the app holds them | When you disconnect the app |
| Change events | CapyDB Postgres | Members and guests of the project | On request, with the project |
| Uploaded assets | Vercel Blob | Anyone with the unguessable address | On request |
| Assistant stream pointers | CapyDB K/V | The API only | Within one hour |
| Assistant conversations | Your browser | You | When you clear site data |
Access
- People sign in through Clerk. Every document, comment, search, project and organization operation verifies a Clerk session token, a project token or a connected app's access token and checks the caller's access to that project.
- Organizations have owners and members. Owners administer people, tokens, GitHub and domains; members read and write documents. A guest reads one project.
- Visitors without an account read only the documents you share by link or publish, on the default branch, and the images those documents show. A link to anything else loses its address on the page, and a document that is not shared answers as a missing page.
- Agents use project tokens. A token is scoped to one project and to
readorwrite, is stored as a hash, is shown once when created, and can be revoked at any time from settings or the CLI. A token can never act at the organization level. - Connected apps such as Claude act as the person who connected them, over OAuth with PKCE. The person chooses
readorwriteon the consent page, which no other site can frame, and an app can never act at the organization level, whatever the person could do. Access tokens last an hour; refresh tokens are replaced on every use. Disconnecting the app in settings ends both at once. - GitHub access is through a GitHub App installation you control. Uninstalling the app on GitHub ends our access to the repository at once.
- The assistant acts with the permissions of the person using it, and asks before it writes.
In transit
Everything is served over HTTPS. Webhooks from GitHub are verified with an HMAC signature before they are processed; unsigned or unmatched payloads are dropped.
AI providers
Model calls go through Vercel AI Gateway to the provider of the model chosen. Which text is sent, and how to avoid it, is on the AI disclosure.
What we do not do
No analytics, no tracking cookies, no error-tracking SDK in the app, no email sending of our own. The only cookies are Clerk's session cookies; see the cookie policy.
Known limits
We would rather you read these here than discover them.
- An owner deletes a project or an organization from its settings. Deleting an account is done by hand on request to privacy@notdocs.dev, within 30 days. There is no bulk export, because your content needs none: it is in your repository.
- There is no status page and no published uptime figure.
Reporting a vulnerability
Write to security@notdocs.dev, or read /.well-known/security.txt. Tell us what you found and how to reproduce it. We will acknowledge within three working days, keep you informed while we fix it, and credit you if you want. Please do not access other people's data, degrade the service, or publish the issue before we have had a reasonable chance to fix it; in return we will not take legal action against research done in that spirit.