Privacy & Terms
Privacy policy & terms of use
This page explains what personal data AI Commander processes when you use the relay at aicommander.dev, who else is involved, how long it is kept and how to exercise your rights — and the terms for using Free or buying Pro.
On this page
1. Who is responsible
The operator responsible for the AI Commander service, and the controller for the processing described here, is:
- Legal entity: 2Dynamic Games sp. z o.o. (operator of the AI Commander service, trading as “Coder AI”)
- Registered address: ul. Wadowicka 7, 30-347 Kraków, Poland (European Union)
- Contact email: support@coderai.dev
The same company operates Coder AI and other services. 2Dynamic Games is the operator and seller of Pro; Stripe processes payments but is not the seller or merchant of record.
2. What data we process
AI Commander is built to hold as little as possible. By default you can drive a machine without any account — you simply quote its session code — so for anonymous use we hold no identity data at all. The data we do process is:
- Account email (only if you sign in) — used for passwordless sign-in (an email magic-link, or a passkey once you enrol one) and to bind machines you link to your account. It is encrypted at rest (a dedicated
EMAIL_SECRETroot key); a separate keyed lookup HMAC is used to find your record without ever storing the address in plaintext. - Passkey credentials (only if you enrol one) — if you choose a passkey for sign-in, we store its public key and a signature counter, bound to your account. A passkey's private key never leaves your device and is never sent to us.
- Failed sign-in diagnostics — for failed email-link and passkey sign-in attempts that reach our server, we keep the time, sign-in method, entry point, stage, a fixed failure reason, HTTP status and your internal account identifier when the account can be identified. This log contains no email address, IP address, user agent, sign-in link or token, passkey signature, request body or exception text. Only authorised service operators can read it. Entries expire after 30 days, and a global recording limit protects against flooding; the log is therefore not a complete count of every attempted sign-in.
- Security alert emails (only if you sign in) — after a successful sign-in and after sensitive account changes (creating or revoking API keys, confidential OAuth clients, OAuth connections or service tokens; adding or deleting passkeys; emergency lock or unlock; turning off or lengthening daily credential reactivation) we send you a short security email. Sign-in emails are sent only when you sign in from a network not seen on your account in the last 90 days (your very first sign-in only records the network, without an email). It contains a fixed description of the event, the server time in UTC, optionally an approximate country and the network operator (for example your internet provider) derived by Cloudflare from the connection (both may reflect a VPN, proxy or network provider rather than your location, and are never used to allow or deny anything), and a link to the dashboard Security page. It never contains your IP address, user agent, key, client, token or passkey identifiers, names you gave them, or machine data. We keep no log of these alerts. To recognise known networks we store only a peppered hash of the network prefix (the first three parts of an IPv4 address or the first three groups of an IPv6 address) — never the IP address itself.
- Session codes (
AIC-XXXX-XXXX-XXXX) — the credential for a machine. The plaintext code is never stored; every record is keyed by a one-way, salted (peppered) HMAC hash, so a database leak contains no usable codes — except that, if you link a machine to your account, we store the first two characters of that code as a label to tell your machines apart in the dashboard; this two-character fragment cannot be used to reconstruct or use the code. - API keys and agent tokens — stored only as salted hashes, never in plaintext, and revocable.
- Minimal operational metadata — magic-link tokens, OAuth state, web-session records, and per-IP / per-email rate-limit counters needed to run the service and resist abuse. Connection-time data (such as IP address) is processed transiently at the edge for rate limiting — and, for product analytics, to compute the daily-rotating visitor hash described below — and is not retained as a profile.
- Files you transfer — when you use the file-transfer feature to copy a file off one of your machines (or onto one), the file's bytes pass through and are stored temporarily on our infrastructure so they can be collected. Each stored copy becomes inaccessible 24 hours after it is created, whether or not anyone downloaded it, and the download link stops working after one hour. An hourly cleanup sweep retries failed deletions, so physical bytes may remain as an inaccessible object until a later successful sweep. There is no way to list, rename or renew a stored file, and this is not a backup service. We do not store the file's name or path — only its bytes, its size, and which account it belongs to — and we do not read, scan, or index the contents. Files you never transfer are never touched: the feature only moves what you explicitly ask it to.
- Usage counters — so we can tell whether the service is being used and which parts of it, we keep a plain tally: for each account (or a single shared “anonymous” bucket for people using a session code without an account), a count of calls per UTC day per surface — commands run, jobs started, status checks, screenshots, file transfers — plus the number of bytes transferred. That is the whole per-account record. It contains no command, no path, no filename, no machine identity, no IP address, and no time more precise than the day, so it cannot show when you were at a machine or what you did with it. Counters are deleted after 180 days. Separately, every metered call (the same calls the counters above tally; not connection handshakes, refused or rate-limited requests, or dashboard pages) also leaves one data point with Cloudflare Analytics Engine, our infrastructure provider’s analytics store, which records the exact time of the call and keeps it for about 3 months. Each data point holds no account, no IP address, no user agent, no machine identity and no session code — only, from a fixed list of values, which kind of AI app made the call (such as “Claude Code”, “ChatGPT”, “Cursor” or “other”, derived from the app’s self-reported name and never stored as that name), over which access route (remote MCP, the npm bridge or the REST API), with which kind of credential (OAuth, API key, session code or service token), and which kind of call it was. The same store also receives one equally anonymous data point when an onboarding step happens (an account is created, an AI app is authorized, a machine is linked, or a call is paused by the sign-in window) — holding only the step, the kind of AI app and a fixed variant, never who or which machine.
- Billing data (only if you open Checkout or use Pro) — the Worker creates a Stripe Customer linked to your internal user id and your account email, so Checkout is prefilled and Stripe's receipts reach you; if a Customer created earlier has no email, the Worker adds your account email once — only while you have no Checkout page open — and never replaces an address Stripe already holds. If Stripe does not accept the address, the Customer is created without it. The Worker stores only the Stripe customer identifier, your local plan (
freeorpro), and, for each Checkout page opened for you, a small record so we can see where a purchase was abandoned: the Stripe Checkout Session id, when Stripe created it, its state (started,processingwhile a delayed payment method such as a bank debit is being confirmed,completed,expiredorasync_payment_failed), whether its purchase was reported to analytics (so it is reported only once), and when the record was created and last changed; your account also keeps a summary of your most recent Checkout (its session id, state, and the time it started and last changed). Stripe-hosted Checkout collects billing/contact details, tax information and payment-method details directly from your browser as needed for the methods you choose. Stripe sends the Worker signed customer/subscription events and current subscription status so it can update the plan; those event payloads are processed for reconciliation, not copied into our account database. The Worker never receives or stores your full card number, security code, or payment credentials. - Public-site feedback — public AI Commander pages load the CoderAI feedback widget from
coderai.dev. Loading it discloses ordinary web-request data, such as your IP address, user agent, and the referring site origin, to that service. If you send feedback, the widget also sends your message, any email address you choose to enter, the AI Commander hostname, the full URL of the page from which you submitted it, the time between opening and submitting the form, and an empty anti-spam honeypot field. This integration does not pre-fill or send your AI Commander account email. The authenticated dashboard does not load the widget; its feedback links return you to the public site. - Web fonts — our pages, including the dashboard and this policy, load their typefaces from Google Fonts (
fonts.googleapis.comandfonts.gstatic.com). Google receives your IP address and user agent when a page loads its fonts from Google's servers, as with any web request. No Google script runs, no cookie is set, and no account information and nothing beyond that request data is sent to Google this way. - Product analytics (cookieless, server-side) — to understand which pages bring people to AI Commander and where sign-up and upgrade stall, the Worker sends a small set of events to Google Analytics 4 through Google's server-to-server Measurement Protocol. No Google script runs in your browser and your browser never sends analytics to Google: our pages post a short first-party beacon to
/api/collecton our own domain, and the Worker forwards a cleaned-up event. The Worker never calls Google while handling your request: it places the finished event on a Cloudflare Queue, and a separate Cloudflare queue job sends it to Google later, so GA4 events are sent from Cloudflare's queue infrastructure without your IP address. What is sent: the page path — only for a page of our public site or the dashboard; any other address on our domain (for example a mistyped link) is reported only as/(other)— (only the query parametersutm_source,utm_medium,utm_campaign,utm_term,utm_contentandref— as short labels; values that look like an email, IP address, session code, token or random id are dropped — andbillingare kept, never anything else in the URL), the dashboard section you open (one of a fixed list such as#/machines, never an id), the referring site's origin only (for examplehttps://www.google.com; nothing at all when that address is an IP address,localhost, a local-network.localname or carries a port number; when you come from another page of ours, that page's path), your country and city as derived by Cloudflare, and these events: page views,sign_upandlogin(with the method — magic link, passkey or OAuth, and for OAuth sign-ins a coarse label for the connecting app, such as “ChatGPT”, “Claude” or “Cursor”, or “other”; never the name the app registered),machine_connected(machine count, plan, whether it is your first),begin_checkoutwhen a new Checkout page is opened for you andpurchaseonce Stripe confirms that Checkout payment succeeded — for a delayed method such as a bank debit, only after the payment clears (the Pro item with its price and currency — for a purchase, the amount that Checkout actually charged and its currency, so 0 with a 100%-off promotion code — and for a purchase the Stripe subscription id), plus views/clicks of the dashboard's upgrade banner (with your machine count), returning from Checkout, and clicks on our/agent-stack/pages, or in the “MCP stack” section of a/with-…/integration page, through toplai.chat,mcpfinder.dev,cnvs.apporgithub.com(only which of those four sites; never the full link). No page title and no browser language are sent. Anonymous page views carry only a pseudonymous visitor hash: a keyed HMAC of the UTC date, IP address and user agent, computed in the Worker and rotated every day, so they are not linked across days; one day counts as one session. Account events —sign_up,login,begin_checkout,machine_connectedandpurchase— also carry a stable pseudonymous account hash (a keyed hash of your internal account id, sent as the GA4 user id — never the id itself), so GA4 can link those events of your account across days; page views (including dashboard pages), upgrade-banner, Checkout-return and MCP-stack click events never carry it; events that happen without your browser (such as a purchase confirmed by Stripe, or a machine linked by an agent) use a stable keyed hash of the account id as their visitor id too. What is not sent: no cookies or local storage are used for analytics, no IP address, no email address, no raw account id, and no command, output, file or machine data. Events are marked as not for ad personalisation, and Google Signals is disabled. Global Privacy Control / Do Not Track: if your browser sends either signal, the beacon is not sent, and nothing triggered by a request from that browser is sent either — page views, upgrade-banner, Checkout-return and MCP-stack click events,sign_up,login,begin_checkout, andmachine_connectedwhen you add a machine in the dashboard. Events that no browser request is involved in cannot see the signal and are still sent:machine_connectedwhen an agent or AI app links a machine to your account, andpurchase, which is triggered by Stripe's confirmation. To object to those as well, contact us (section 1). - Cookies — only strictly necessary
SameSite=Laxcookies: a 24-hour session cookie set after you sign in (absolute — using the dashboard does not extend it), a 15-minute dashboard magic-link binding cookie (so an emailed URL works only in the browser that requested it), and a short-lived OAuth authorization binding cookie. All areHttpOnlyandSecure; the raw magic-link binding stays only in the browser, while D1 stores its peppered hash. There are no advertising, analytics or cross-site tracking cookies. If you dismiss the dashboard's upgrade banner, that choice is kept in your browser'ssessionStoragefor the current tab under a stable, account-specific key that our server derives with a secret from your account ID; the stored key is not your raw account ID or email address. Dismissing the early banner, shown after five linked machines, is also kept under that key inlocalStorageuntil you clear this site's data; the usage banner at eight or more saved machines can appear on a later visit. Your dismissal choices and this key are not sent in analytics.
3. How we use it
- Running the service — registering agents, routing commands to the right machine by session code, and (for signed-in users) resolving machine aliases. Legal basis: performance of the service you request, GDPR Art. 6(1)(b).
- Sign-in & account features — delivering magic-link emails and keeping you signed in. Legal basis: Art. 6(1)(b).
- Account security alerts — transactional emails about sign-ins and sensitive changes to your account, so you can spot activity that was not yours and use Emergency lock. They are part of the service and have no unsubscribe. Delivery is best-effort: a failed email is not retried. Legal basis: performance of the service, Art. 6(1)(b), and our legitimate interest in account security, Art. 6(1)(f).
- Abuse prevention — per-IP and per-email rate limiting, an optional bot gate (Cloudflare Turnstile) on the OAuth page, security hardening, and the minimal failed sign-in diagnostics described above to investigate outages and abuse. Legal basis: our legitimate interest in keeping the service available and free of fraud, Art. 6(1)(f).
- Transferring files you ask us to — carrying a file between your machine and you, with access limited to the 24 hours available for collection and cleanup afterward. Legal basis: performance of the service you request, GDPR Art. 6(1)(b).
- Understanding usage — the aggregate counters described in section 2, used to see whether the service is used at all, which surfaces matter, and what a paid tier should measure. The counters are aggregated by day at the moment they are written, so they hold no per-event history to analyse. (The separate product-analytics events below are individual events, but pseudonymous and free of command or machine data.) Legal basis: our legitimate interest in operating and improving the service, Art. 6(1)(f).
- Product analytics — the cookieless Google Analytics 4 events described in section 2, used to measure which pages and campaigns lead to sign-ups, connected machines and Pro purchases, and where people drop off, so we can improve the site and onboarding. Legal basis: our legitimate interest in understanding and improving our website and product, Art. 6(1)(f); we keep the data minimal and pseudonymous, use no cookies for it, and honour Global Privacy Control / Do Not Track for every event triggered from your browser (see section 2 for the events that are not). You can object at any time (Art. 21) by enabling GPC or DNT in your browser, and for the remaining account events by contacting us.
- Receiving feedback and support requests — presenting the public feedback form, delivering what you submit to the team, preventing automated spam, and replying if you provide an email address. Legal basis: our legitimate interest in supporting and improving the service, GDPR Art. 6(1)(f), and taking steps at your request where your message concerns the service contract, Art. 6(1)(b).
- Providing Pro and administering payments — opening Stripe Checkout/Portal, reconciling subscription state, providing invoices and handling billing support. Legal basis: taking steps at your request and performing the subscription contract, GDPR Art. 6(1)(b), and compliance with accounting/consumer-law obligations where applicable, Art. 6(1)(c).
We do not sell personal data, and we do not use your data to build advertising profiles.
4. Recipients and subprocessors
AI Commander relies on the following infrastructure and external services, each for a narrow, defined purpose:
- Cloudflare — hosting and infrastructure: the Workers runtime that powers the relay, Durable Objects for live sessions, the KV stores, the D1 account database, R2 for download distribution and for temporarily holding files you transfer, and the edge/CDN. Cloudflare processes TLS-terminated request data in transit. It does not receive a persisted copy of your commands or their output.
- Cloudflare Turnstile — an optional bot challenge on the OAuth authorize page.
- Mailgun — delivery of sign-in (magic-link) emails and account security alerts. Mailgun receives the recipient email address and the message content (the sign-in link, or the alert text described in section 2). Your encrypted email address is decrypted only to hand it to Mailgun for that send. AI Commander uses Mailgun's EU region (
api.eu.mailgun.net). - Stripe — payment processor and hosted billing provider. Checkout collects payment and billing details directly; Customer Portal lets you manage payment methods, invoices, and cancellation. Stripe can act as our processor for payment transactions and as an independent controller for some of its own legal, fraud-prevention, and service purposes. See Stripe's Privacy Policy and Privacy Center.
- Google (Google Analytics 4 and Google Fonts) — Google Analytics 4 receives, from Cloudflare's queue infrastructure on our behalf (never from your browser, never with your IP address), the pseudonymous product-analytics events described in section 2 (no cookies, no email, no raw account id, no command data). Separately, Google Fonts receives your IP address and user agent when a page loads its fonts from Google's servers (section 2). For Google Analytics 4, Google Ireland Limited / Google LLC process this data as our processor under Google's Analytics data processing terms; for Google Fonts, Google acts as an independent controller under its own privacy policy. Google may process this data in the United States, where Google LLC participates in the EU–US Data Privacy Framework. See Google's privacy information for business products.
- CoderAI feedback service — the feedback SDK and submission endpoint at
coderai.dev, operated by 2Dynamic Games sp. z o.o., receive the public-site request and feedback data described in section 2 so the team can collect feature requests and bug reports, prevent spam, and respond when requested. It is loaded only on public pages, not in the authenticated dashboard.
We do not add a subprocessor that receives command payloads, because no command payload is ever stored or forwarded to anyone but the agent that runs it. Files you explicitly transfer are the one exception to “nothing is stored”: they are held temporarily in Cloudflare R2, become inaccessible after 24 hours, and are then deleted by an hourly, retrying cleanup sweep.
5. Retention
- Commands and output — not retained at all (see section 2).
- Failed sign-in diagnostics — entries are excluded from reads after 30 days. An hourly cleanup removes expired entries in bounded batches. Physical deletion can be delayed by a backlog, a cleanup failure or a temporary operational shutdown; cleanup resumes when service operations recover.
- Security alerts — not retained by AI Commander; once handed to Mailgun, the message is subject to Mailgun's delivery-log retention. The peppered hash of each sign-in network prefix (not the IP) stops counting as known 90 days after it was last used and is deleted the next time a new network is recorded for the account; at most 20 are kept per account.
- Magic links, web sessions, WebAuthn (passkey) sign-in challenges and old revoked API keys — short-lived; a scheduled hourly cleanup job purges them once they expire so the tables do not grow unbounded.
- Account data (your encrypted email, machine aliases, API-key hashes) — kept while your account exists; removed when you delete your account.
- Session-code records — keyed by hash and tied to an agent registration; cleared when the code is changed or the agent uninstalled.
- Transferred files — access ends 24 hours after creation, downloaded or not. The deadline is checked on every read, so a stored copy stops being reachable the moment it turns 24 hours old rather than whenever cleanup next runs. An hourly job then attempts to erase the bytes and retries failures; physical bytes can therefore remain as an inaccessible object until a later successful sweep. The one-hour download link expires sooner on the same terms, and its spent or expired token is removed by the same retrying cleanup process.
- Usage counters — 180 days, then purged by the same hourly cleanup job. You can see your own counters any time in the dashboard under Usage.
- Product analytics — Google Analytics keeps event-level data for 2 months and user-level data (data tied to the visitor and account hashes) for 14 months, then deletes it; Google Signals is disabled. The Worker keeps no copy; an event waiting in the Cloudflare Queue is held only until it is delivered (normally seconds; a failed delivery is retried at most twice, then dropped). Anonymous visitor hashes rotate daily and are not linked across days; the account hash on signed-in events is stable, as described in section 2.
- Billing — the Stripe customer identifier, current local plan and the Checkout records described in section 2 are retained with the account. Stripe retains transaction, invoice, payment-method, and compliance records under its terms and legal obligations. We retain accounting or dispute records only for the period required by applicable law or needed to establish, exercise, or defend claims.
6. Access model & anonymous use
A session code is the credential for its machine: anyone who knows a current code can act on it until the owner resets the code or blocks their account. Linking an account is optional: signing in lets you save machines under friendly aliases and reach them with a personal API key. Free includes up to 10 usable saved devices and no new file transfer. Pro enables every saved device up to the Pro plan limit of 100 records and upload/download. If Pro ends while more than 10 records exist, nothing is deleted: the 10 oldest remain usable and the rest stay saved but plan-restricted. Anonymous command/status onboarding remains available during a code's first hour, but anonymous file transfer is not. Full detail is in Security.
7. Pro subscription, cancellation, payments & consumer rights
- Seller and purchase information. You buy Pro from 2Dynamic Games sp. z o.o.; Stripe processes the payment. The recurring price, currency, billing frequency and any applicable tax are shown in Stripe Checkout before you confirm. If no Pro Price is configured, purchase is unavailable rather than priced by this page.
- Renewal. Pro renews automatically at the interval shown at Checkout until cancelled. Charges use the payment method managed through Stripe.
- Manage or cancel. Open Manage subscription in the dashboard to enter Stripe Customer Portal. The Portal shows whether cancellation is immediate or takes effect at the end of the current billing period; that confirmation controls the effective date. When Pro ends, the account returns to Free: saved devices are not deleted, but only the 10 oldest remain usable and no new file transfers can start. Existing temporary blobs/links expire on their original deadlines.
- Payment problems and refunds. Contact support@coderai.dev for an incorrect charge, refund request, or billing complaint. Refunds are assessed under the purchase terms, mandatory consumer law, and the facts of the transaction; Stripe executes payment/refund processing but does not replace the seller.
- Statutory rights. If you are an EU/Polish consumer buying at a distance, you may have a 14-day statutory right to withdraw from a service contract, subject to the statutory rules for performance begun at your request and services already performed. Mandatory conformity, complaint, refund, and withdrawal rights are not limited by these terms. To exercise a right or ask for the applicable form, email support@coderai.dev with enough purchase information to identify the subscription. Official guidance: UOKiK — withdrawal from a distance contract and Your Europe — 14-day cooling-off period and exceptions.
8. Your rights
Subject to the conditions in the GDPR, you have the right to access your personal data, rectify inaccurate data, erase it, restrict or object to processing, and data portability. To exercise any of these — or to delete your account — contact support@coderai.dev. Because most processing is keyed by hashes and accounts are minimal, you may need to provide enough information to identify the account concerned. You also have the right to lodge a complaint with a supervisory authority — in Poland, the President of the Personal Data Protection Office (Prezes Urzędu Ochrony Danych Osobowych, UODO), ul. Stawki 2, 00-193 Warszawa.
9. The service is provided “as is”
AI Commander is a relay plus an agent that, once installed by the user, can execute shell commands — by default as root — on the user's machine. It is remote shell access, not a sandbox. Because of that, the following terms apply to everyone who uses the service:
- Authorization. You warrant that you own, or are explicitly authorized to control, any machine on which you install the agent, and any machine you connect to via a session code. Installing or using AI Commander on machines you do not own or are not authorized to control is prohibited and is entirely your responsibility.
- Safeguarding credentials. You are responsible for protecting your session codes and API keys. Anyone who knows a current session code (no account needed in its first hour, or via a linked account at any time) can request commands on the corresponding machine — guard them like an SSH private key.
- “As is” / “as available”. The service is provided “AS IS” and “AS AVAILABLE”, without warranties of any kind, whether express or implied, including (without limitation) the implied warranties of merchantability, fitness for a particular purpose, availability, uninterrupted or error-free operation, and non-infringement. We do not warrant that the relay will be available at any given time.
- No liability. To the maximum extent permitted by law, the operator (2Dynamic Games sp. z o.o.) shall not be liable for any direct, indirect, incidental, consequential, special, exemplary or punitive damages — including, without limitation, data loss, downtime, business interruption, security incidents, unauthorized access, or damage to systems or devices — arising out of or relating to your use of, or inability to use, the service, even if advised of the possibility of such damages.
- Indemnity. You agree to indemnify and hold harmless the operator against any claims, losses, liabilities, damages, costs and expenses arising from your use of the service, the commands you (or an AI acting on your behalf) run through it, or your breach of these terms.
Nothing in this section limits liability that cannot be limited or excluded under applicable mandatory law.
10. Report a bug or feature, and contact
Found a bug or have a feature request?
On public pages, the feedback button loads the CoderAI widget from coderai.dev. The authenticated dashboard does not load the widget; its feedback links return you to the public site to open it. You can also reach the team directly for any matter — including privacy requests and security reports — at support@coderai.dev.
11. Licensing
Three different regimes apply, so it is worth stating which is which. The
desktop application (AI Commander for macOS and Windows) and the
relay service are proprietary: this notice grants no licence to
their source, and no right to copy, modify or redistribute them.
@aicommander/agent, the on-machine agent published on npm, is
licensed under the Elastic
License 2.0 from version 1.1.0 onward — version 1.0.56 and every release
before it were published under the MIT licence, and that grant is irrevocable for those
versions. @aicommander/mcp, the MCP server you install beside your
AI client, is MIT.
The agent’s source is public at
github.com/AICommander-dev/aicommander-agent.
Third-party components carry their own terms: each npm package ships its licence file in its
own tarball, and the desktop application installs a THIRD-PARTY-NOTICES.txt
naming the components compiled into it and where the remaining texts live.
12. Changes to this notice
We may update this notice as the service evolves. The current version is always published at this URL; the date below reflects the last revision.
Last updated: 2026-10-24