Privacy Policy

juudd — Just Upload. Done. Deployed.

Operated by MATTREK TECHNOLOGY CO., LTD. (บริษัท แม็ทเทรค เทคโนโลยี จำกัด), 147/169 หมู่ที่ 3 ตำบลสวนหลวง อำเภอกระทุ่มแบน จังหวัดสมุทรสาคร 74110, Thailand. Effective September 2, 2026. Last updated October 15, 2026.

This policy covers juudd.com, the connector at mcp.juudd.com (including when you use it as an app inside ChatGPT, Claude or another AI assistant), and the signed-in panel. It does not cover the sites our customers deploy: those belong to the customers who deploy them, and what a deployed site does with its own visitors is between that site and its visitors. The section "Your site's end users" says who is responsible for what.

We wrote this the way we write everything else: every statement here is one we can point at in our own system. Where something is not built yet, we say so instead of promising it.

At a glance

Every category of data juudd handles, why, who else receives it, how long it is kept, and what you can do about it. The sections after this table explain each row.

DataPurposeRecipientsRetentionYour controls
Account: sign-in subject identifier, token issuer, email address if the sign-in token carries one, and the name and version each AI app you connect reports about itselfSigning you in; tying sites and history to your accountWorkOS (identity provider); Neon (stores our database)While your account existsRemoved on request to the address at the end of this policy
Action history: which action, which site, when, allowed or refused, refusal wordingAnswering what happened to your site; enforcing limits; security and abuse reviewNeonWhile your account exists; no automatic deletionVisible to you in the panel and through list_refusals; removal on request
Site files and function code you deploy, upload or build, every versionServing your site; rollbackWasabi (storage); Cloudflare (serving)Permanently, so any version can be restoredread_site exports everything; unpublish_site stops serving
Build source you send to start_buildRunning the buildCloudflare (build sandbox)Deleted from the build machine when the build ends; only the output is stored, as a versionUse request_upload to build on your own machine instead
Build record: framework, outcome, error, the last 6,000 characters the build printedReporting the build result through build_statusNeonWhile your account exists; no automatic deletionRemoval on request
Your site's database and what your site stores in itRunning your siteNeonUntil you take it with transfer_database; we keep no copy afterwardstransfer_database, at any time
Your site's brief: what it is for, written by your assistant with write_site_brief, every writing of itShowing the next assistant that works on the site what it is forNeonWhile the site existsread_site shows the newest; rewrite it at any time
Secret names you declare; whether each has a valueCarrying your secrets across deploysNeonWhile the site existslist_secrets; set or replace a value in the panel
Secret values you type into the panelLetting your site's functions read themCloudflare, as an encrypted binding on your siteNever stored by us; held by Cloudflare until replaced or the site is taken off the airReplace in the panel; unpublish_site discards them
Upload links: a one-way digest of the link, its site and expiryLetting one upload into one siteNeonLink valid 15 minutes, single use; record deleted one day after expiryDo not share a link; it expires on its own
Failure counts for your site: method, path (no query string), 500 or 503, hour, countTelling you through site_errors that visitors saw a failureNeonSeven days, deleted automaticallyRead through site_errors
Your email address, asked of WorkOS when your first site goes liveSending you one email with your site's link and what you can do nextWorkOS (holds it); Resend (sends the email)Not stored by us; used for that one email and droppedNone needed: it is sent once, for your first site only
Problem reports you send from the panel: what you wrote, the error the panel was showing, the panel page, the site if it is yours, and whenAnswering you, and fixing what went wrongNeon; Cloudflare, which emails a copy to us180 days after you send it, deleted automatically; the emailed copy stays in our mailboxRemoval on request
Server request logs: method, path, query-parameter names, whether a token was present, user-agent, durationOperating and debugging our serversRailway (hosting)Kept by Railway under our plan's log retention; we do not export or archive themNone needed: no request body, parameter value or credential is logged
Database owner connection string, shown in the panelLetting you connect to your own databaseNeon (issues it)Not stored by us; the fact that it was shown is recorded in your historyreset_database_credential
Conversations with the assistant juudd runs: what you typed, what it answered, and the names of the tools it usedLetting a conversation continue where you left itAnthropic (runs the model); Neon30 days after your last message in that conversation, deleted automaticallyDelete a conversation yourself at any time, from the assistant page
Photos you add on the assistant's page, after your browser has shrunk themPutting a photo on the page the assistant builds for you; letting the model see it, to place it and to read what a photo of a menu or a sign saysWasabi (storage); Anthropic, with the one message you attached it toKept until you ask us to remove them. Nothing deletes them automatically, and we would rather say so than state a period we do not enforceRemoval on request; a photo used on a site is also part of that site's versions
One sign-in token of yours, sealed: the refresh token, while you use that assistantLetting a build you started keep running after your five-minute access token runs outNeon, encrypted; the key is in the service, not the databaseUntil you sign out, or two days without useSign out — it is deleted
What that assistant spent for you: model name, token counts and cost, one row per answerKeeping your use inside its allowance, and billing a top-up against itNeonWhile your account exists; no automatic deletionThe share you have used is shown on the assistant page; removal on request
Page views on juudd.comCounting visits to the marketing siteGoogle AnalyticsUnder Google Analytics' retention settings; not on the panel or connectorBlock the tag; the site works the same

We do not sell any of this, we do not use it for advertising, and we do not use it to train AI models.

What we hold about you

Your account. You sign in through WorkOS AuthKit; there is no separate juudd password and no API key. What we keep is the subject identifier your sign-in token carries, the token's issuer, and an email address if the token ever includes one. Your account id is derived from that subject and nothing else. When an AI app connects, it introduces itself by a name and version it chooses, and we keep that against your account with when we first and last saw it, so we can tell which apps people reach us through.

What you did, and what you were refused. Every action that changes something (a deploy, a database created, SQL applied, a domain claimed) is recorded: which account, which action, which site, when, and whether it was allowed or refused, with the refusal's exact wording. Refused reads are recorded too. This history is how we can answer "what happened to my site on Tuesday", and it accumulates; we have not yet set a retention period, and this policy will change when we do. The record never contains a credential, and the SQL statements you run are not recorded: those are your data, and only the fact that SQL ran is kept.

One exception, because it is the kind of thing a policy should not leave you to discover: when Postgres refuses a statement, we keep its error message, so that you can be told exactly why. Postgres sometimes quotes the offending value in that message, a duplicate email address for instance, so a failed apply_sql can leave a fragment of your data in this history. Successful statements leave none.

Operators are people on our side who can look across accounts. There are only ever a handful, each is a row we add by hand, and it is not a role anyone can grant themselves.

If an operator opens your account's history, that read is written into the same history, under your account, naming the operator. One thing is not: we also have a platform-wide view of recent activity across every account at once, and opening that is recorded against the operator who opened it rather than against everyone who appears in it. So a line of yours can be seen there without a line appearing in your history. Anything an operator does to your account (stopping a site serving, putting it back, suspending or restoring the account, releasing a domain) is written under your account, naming them, as it always was.

To show an operator a name rather than an identifier, we ask WorkOS who a subject is and hold the answer in memory for a few minutes. It is never written to our database, so it is not part of what we keep, below.

And when you read your database's owner connection string in the panel, that read is recorded in your history too, because handing out an owner credential is an act worth being able to look back at.

What you deploy. Your site's files and server-side function code, every version, kept permanently. This is a promise, not an accident: it is what makes a rollback possible. It also means a site can be replaced but never wiped. Treat everything you deploy as public and keep secrets out of it; the tools tell your assistant the same thing.

Your site's database. Each site gets its own Postgres database, created in our account at Neon. Until you take it with transfer_database, we hold it, and our tools run SQL against it only when you ask them to. We do not read it for our own purposes, ever; whatever your site stores in it about its own users is yours, not ours. The owner connection string is shown to you, a person, in the panel; it is never handed to an assistant, because a tool result is not a safe place for a credential. After a transfer we cannot read, back up, or recover that database at all.

Builds and uploads. A project that needs building reaches us one of two ways. With start_build, your assistant sends the project's source; we run the build on a Cloudflare sandbox reserved for your account, using our own pinned toolchain, delete the working folder when the build ends, and store only the output as a version. We keep a record of the build (framework, outcome, any error, and the last 6,000 characters it printed) so build_status can report it. With request_upload, you build on your own machine and a script posts the output to a link that works once, for fifteen minutes, for one site. We store a one-way digest of that link, never the link itself, and delete the record a day after it expires.

Secrets. request_secret declares a name (like STRIPE_SECRET_KEY) and gives you a link to the panel. You type the value there, never into the conversation. The value goes straight onto your site at Cloudflare as a binding we cannot read back; we store only the name and whether it has been set. Taking a site off the air discards the values, and you set them again before it serves.

When your site fails in front of a visitor. If a visitor's request to your site ends in a 500 or 503, our front door counts it: the site, the request method, the path without its query string, which of the two outcomes, and the hour. Nothing else: no IP address, no headers, no body, nothing your function printed. The counts are deleted automatically after seven days, and site_errors reads them.

Conversations with juudd's assistant. If you use the assistant juudd runs, rather than connecting your own, we keep what you typed and what it answered, with the names of the tools it used, for 30 days after your last message in that conversation, and then delete it. You can delete a conversation yourself at any time. We do not keep what the tools sent or returned: site files are already in your stored versions, and query results or hand-over links are not written down anywhere. The table that holds a message has no column they could go in.

Photos you add there. The assistant's page lets you attach photos to a message, up to six at a time. Your browser shrinks each one before it leaves your phone, and we keep it under your account, named by a digest of its own contents. The photos are sent to Anthropic with that message, so the model can see them: to decide where each one goes, to describe it for visitors who cannot see it, and to read the items, prices and details from a photo of a menu, a price list or a sign. They are sent with the message you attached them to and not again with later ones; the conversation we keep holds only each photo's name. The model never writes the photo out: the assistant puts our stored copy on the page. The site then holds its own copy: what a visitor loads comes from the site, not from us. Nothing deletes the one we hold. Deployed versions are permanent by design and a photo used on a page is part of one, but the copy you uploaded is kept whether you used it or not, and no automatic deletion is built. We would rather write that down than state a period nobody enforces; ask us and we will remove it.

The one credential we keep. An access token from sign-in lives five minutes, and a build you asked the assistant for can run longer than that, with you switched to another app. So a deployment running the assistant asks for a refresh token at sign-in and keeps it — one row per account, encrypted with AES-256-GCM under a key that lives in the service's environment and not in the database, tied to your account so a copy of the row under another account does not open. It is spent and replaced when your access token is nearly out, deleted when you sign out, and removed after two days without use. This is the only credential of yours we hold, and it is worth being plain about: we designed secrets (below) specifically so we would not hold them, because a secret has somewhere else to live. A refresh token for a job you are watching has nowhere else. What it reaches is your own account and nothing more.

Beside it we keep one row per answer the model gave — which model, how many tokens went in and came out, and what that cost. That row is what your allowance is counted against and what a top-up is drawn from, so it outlives the conversation it came from; it holds nothing you typed.

One email when your first site goes live. When the first version of the first site on your account is published, we ask WorkOS for the email address you signed in with and send you one email: your site's link, how to change it or put it on your own domain, and that you can reply to reach a person. The address goes from WorkOS to us to Resend, which sends the email, and we do not store it. A second site, a redeploy or a rollback sends nothing, and there is no mailing list.

Problem reports, and when you get stuck. The panel has a form for telling us something went wrong. We keep what you write, the error message the panel was showing when you opened the form, which panel page you were on, the site if it is one of yours, and the time, for 180 days, and email a copy of it to ourselves so a person sees it; the copy in our mailbox is not deleted on that schedule. Separately, if you are refused the same action on the same site three times within fifteen minutes, we email ourselves the refusal from your action history, so we can help you without your having to write in. Neither adds anything to what is described above: the report is only what you typed and our own error message, and the refusal is a line your history already holds. Do not paste a password or an API key into a report.

Billing. Payments are not live yet. When they are, they will be handled by Stripe; your card details will go to Stripe and never to us, and we will keep only the Stripe customer id that links your account to your subscription.

Operational logs. Our servers log each request's method, path, the names of query parameters (never their values, never a request body), whether it carried a token, the client's user-agent string, and how long it took. Our storage provider writes its own access log of bucket operations.

Analytics on the marketing site only. juudd.com uses Google Analytics 4 (property G-T38LE5HK7G) to count page views. The page works exactly the same with the tag blocked. The panel and the connector carry no analytics.

What we do not have

  • Server logs from your site. Nothing captures what a deployed function prints. There is no runtime log for us to read, sell, or leak.
  • Your site's visitor traffic. Requests to deployed sites go to Cloudflare's edge and are served there. They never reach our servers. The only trace a visitor leaves with us is the seven-day failure count described above, which holds a path and no information about who asked for it.
  • Your conversation, when the assistant is your own. Connect your own assistant and we never receive your chat history, your prompts, or its replies: the connector sees only the arguments of each tool call it makes, listed below, and nothing else. The exception is the assistant juudd runs, where the conversation is with us and is described above — it is named here rather than left for you to notice. Either way we do not ask for your location, contacts, or any profile data.
  • Payment cards, passwords, or API keys through the assistant. No tool asks for a card, a password, or an API key. Secrets are entered in the panel, not passed to a tool. The one exception is set_database_url, below.
  • Your database credentials. Connection strings are fetched from the provider when a tool needs one, held for the length of that call, and not stored. A credential you paste into set_database_url is written onto your site as a binding we cannot read back, and is neither stored nor logged by us. Read this bullet as what it says and not as "no credentials at all": if you use the assistant juudd runs, we keep one sealed sign-in token of yours, described above.

What each tool takes, and what it returns

These are the connector's tools as they run today. "Recorded" means the call is written into your action history as described above; tools marked read-only record nothing when they succeed, and every refusal is recorded.

ToolTakesReturnsKept by us
helloA name to greetA greetingNothing
deploy_siteSite id, optional subdomain, site files, function codeVersion id, address, routingThe files as a version; recorded
list_deploysOptional site idYour sites, or a site's versionsRead-only
read_siteSite id, optional versionThat version's filesRead-only
publish_deploySite id, optional versionWhich version is now servedRecorded
request_uploadSite idA one-time upload link and the script that uses itDigest of the link, one day past expiry; recorded
start_buildSite id, project source files, optional routingJob id, and the result if the build finishes in the callOutput as a version; build record; recorded. Source is not kept
build_statusJob idBuild outcome, error, tail of the build outputRead-only
unpublish_siteSite id, confirmation that secret values will be discardedConfirmation the site stopped servingRecorded; stored versions are kept
create_databaseSite idConfirmation; never a connection stringA reference to the Neon database; recorded
database_statusSite idWhether a database exists and who holds itRead-only
apply_sqlSite id, SQL statementsUp to 20 rows per statement, which may include data your site storesThat SQL ran, not the statements; a refused statement keeps Postgres's error message; recorded
transfer_databaseSite idA one-time link to take the databaseRecorded
set_database_urlSite id, a connection string to a database you ownConfirmation, never the valueNot stored, logged, or echoed; written onto your site; recorded
reset_database_credentialSite idConfirmation; the new credential is shown only in the panelRecorded
claim_domainSite id, a domain you ownThe DNS record to add, or a link to approve it at your DNS providerThe domain and its status; recorded
domain_statusDomainVerification and certificate statusRead-only
release_domainDomainConfirmationRecorded
request_secretSite id, secret nameA panel link to enter the valueThe name; recorded
list_secretsSite idNames, and whether each has a value; never a valueRead-only
site_errorsSite idFailure counts by path and hour, up to seven days backRead-only
list_refusalsOptional limitYour recent refusals and their wordingRead-only

One thing to understand about the channel

You use juudd through an AI assistant, either your own or the one juudd runs. Some tool results flow into that conversation: rows returned by apply_sql, and the one-time hand-over link from transfer_database. Your AI provider keeps its own logs of that conversation under its own policy. The channel is the product working as designed; it is also outside our control, and worth knowing about before you query personal data through it. Your database's owner credential does not travel this channel: it is shown only to you, in the panel.

When the assistant is juudd's, that conversation goes to Anthropic, which deletes API inputs and outputs within 30 days, except where its Usage Policy is enforced, when they may be kept for up to two years (Anthropic). It is not used to train models.

Where data lives, and who touches it

Our infrastructure runs in Singapore. These providers process data for us:

ProviderWhat it receives
WorkOSYour sign-in; it is the identity provider, and it issues the refresh token described above. We ask it for your email address once, to send the email above
NeonYour site's database, and our own control-plane database (accounts, ownership, action history)
WasabiYour deployed files and function code, and photos you add in the assistant's form (Singapore region)
CloudflareServes all deployed sites and juudd.com; sees visitor traffic to them; issues certificates for custom domains you claim; holds your secret values as bindings; runs builds in a sandbox; sends us the email copy of a problem report or a repeated refusal
ResendYour email address and your first site's name and link, to send you the one email when it goes live
RailwayHosts our servers, including their request logs
AnthropicWhat you type to juudd's assistant, the photos you attach to a message, what it answers, and what our tools return to it during a conversation
StripePayment details, when billing goes live
GooglePage-view analytics on juudd.com only

Your site's end users

For personal data your deployed site collects from its visitors, you are the data controller and we are a processor, with the providers above as sub-processors. We never use your end users' data for our own benefit. Thailand's PDPA applies to us; if you collect personal data through your site, complying with the law that applies to *you* is your job, including telling your visitors what your site does.

Your rights

  • Take everything out. read_site returns every file of every version. transfer_database hands you your database, with no deadline and no penalty. Portability is a feature here, not a concession.
  • Stop serving. unpublish_site takes a site off the air at once. Nothing stored is deleted, and publish_deploy puts it back.
  • See what we recorded. Your sites, versions and action history are in the panel; list_refusals, list_secrets and site_errors answer from inside the conversation.
  • Access and correction. Ask us and we will show you what we hold; most of it is already visible in the panel.
  • Delete a conversation. A conversation with juudd's assistant has a button that deletes it, and its messages go with it. It is the one thing here you can erase without asking us.
  • Deletion. Honestly: a self-serve deletion path for everything else is not built yet. Deployed versions are permanent by design. Your identity records and action history can be removed on request; write to support@juudd.com, which a person reads, and we will handle it manually.

Changes and contact

If this policy changes, the change will say what changed. Questions go to support@juudd.com. We have not appointed a Data Protection Officer; requests under Thailand's PDPA, including deletion requests, go to that same address, and a person reads it.