Skip to content

Security

Where data lives, how access is scoped, and how to report a vulnerability.

Last revised

On this page

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

WhatWhereWho can read itDeleted when
Documents and commentsYour repository on GitHubEveryone with access to the repositoryYou delete them; it is your repository
Document index: paths, frontmatter, search text, embeddingsCapyDB PostgresMembers and guests of the project, through the API; the text of a document you share by link or publish, to anyone with its addressOn request, with the project
Text of document versions, by content hashCapyDB PostgresOnly the merge and read paths of the APIWith the project, when no other project holds the same text
Accounts, organizations, membershipsCapyDB PostgresOrganization owners, through settingsOn request, within 30 days
Agent tokensCapyDB Postgres, hashedNobody; the secret is shown onceWhen you revoke them
Connected apps' OAuth tokensCapyDB Postgres, hashedNobody; only the app holds themWhen you disconnect the app
Change eventsCapyDB PostgresMembers and guests of the projectOn request, with the project
Uploaded assetsVercel BlobAnyone with the unguessable addressOn request
Assistant stream pointersCapyDB K/VThe API onlyWithin one hour
Assistant conversationsYour browserYouWhen 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 read or write, 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 read or write on 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.