Geans

How to check that your file stays with you

This page describes what happens to your DNA test file during the analysis and how to check it yourself, without taking our word for it. You will need a computer and 5–10 minutes.

What happens to the file

The file you choose is read by your browser, on your computer or phone. Parsing the file, comparing it with the knowledge base and preparing the report all happen inside the open tab. Neither the file, nor any part of it, nor its name, nor the finished report is sent to the server. The report exists only on your screen until you save it.

The browser only downloads from the server: the analysis program (the engine), a session key and a “knowledge base slice” — the part of the database needed for your chip model. To do that it sends the server only service requests: the answer to a small computing task (a check that the request comes from a browser and not from a bulk-download program), the session number in a cookie and the name of the chip model (for example, “23andMe v5”), plus the ordinary headers any browser sends. The browser also sends three service requests about the completion of analysis steps — which step finished and how (“ok” or the kind of error), with no file data. The slice is the same for everyone with that chip and says nothing about you by itself.

The service is designed to work with the internet: a session key is issued for each analysis and is valid for 30 minutes. There is no standalone (offline) version.

Diagram: where the file goes and what comes from the server At the top is the Geans server; it only hands out data. Below is your device: the DNA test file is read by the browser, which parses it, computes the report and shows it on screen; the report can be saved as HTML or PDF. Arrow from the browser to the server: service requests — the browser check (a task and its solution), the session number in a cookie, the chip model name, signals about the analysis steps (the step and a result code) and the ordinary browser headers. Arrow from the server to the browser: the analysis engine, the knowledge base slice for your chip, a session key. The file and the report are not sent to the server, neither whole nor in parts. Geans server only hands out data to the server: browser check, session number (cookie), chip model name, step signals from the server: engine, knowledge base slice, session key Browser (this tab) does the whole analysis Your file DNA test Report screen, HTML, PDF The file and the report are not sent neither whole nor in parts Your device
Figure 1. The file is processed on your device. Only service requests (browser check, session number, step signals) and the chip model name go to the server; the engine, the knowledge base slice and a session key come back.

How to check: every request the page makes in the Network tab

Every desktop browser has developer tools. Their Network tab shows each request the page sends to the internet: where to, with which method and how much data. If the file were sent to the server, the list would contain a POST or PUT request with a body the size of your file (usually 5–30 MB) — or, if the data were hidden in addresses, many requests with long, meaningless addresses.

Important: open the Network tab before you choose the file — the browser records requests only while the panel is open. If you opened it later, reload the page with the panel open and start again.

Chrome, Edge, Yandex Browser, Opera

  1. Open the Geans analysis page.
  2. Open the developer tools: press F12 or Ctrl+Shift+I (on a Mac, ⌘+⌥+I). From the Chrome menu: ⋮ → More tools → Developer tools; other browsers in this group name the menu items differently, but the keys are the same.
  3. Select the Network tab.
  4. If there is no Method column, right-click the table header and tick it.
  5. Choose the file, press “Start analysis” and wait for the report.
  6. Look through the list (Figure 2). Then type method:POST into the Filter box — the list should become empty (Figure 3). You can check method:PUT the same way.

Firefox

  1. Open the Geans analysis page.
  2. Press Ctrl+Shift+E (on a Mac, ⌘+⌥+E): the Network tab opens directly. Or press F12 and select Network.
  3. The Method column is shown by default. “Transferred” is what came over the network, “Size” is the size of the response.
  4. Choose the file, press “Start analysis” and wait for the report.
  5. Look through the list. Type method:POST into the “Filter URLs” box — the list should become empty.

Safari (Mac)

  1. Turn on the developer tools once: Safari → Settings → Advanced → tick “Show features for web developers” (in older versions, “Show Develop menu in menu bar”).
  2. Open the Geans analysis page, then Develop → Show Web Inspector (⌘+⌥+I) and the Network tab.
  3. If there is no Method column, right-click the table header and turn it on.
  4. Choose the file, press “Start analysis” and wait for the report.
  5. Sort the list by the Method column (click its header): every row should say GET.

On a phone, the Network tab can only be opened with the phone connected to a computer, so checking on a computer is easier. The page and the analysis program on the phone are the same.

What you will see

All requests use the GET method, which means the browser only receives data. Large sizes in the list are what is downloaded to you, not what is sent.

Requests made by the analysis page (sizes are approximate)
What it isName in the listWhenHow much is downloaded to you
The page itself and its stylessite address, style.css, app.js, md.js, report_css.json openingtens of KB
Site icon (the browser asks for it by itself)favicon.icoon openingalmost nothing
Analysis engineworker.js, five pyodide… files, core.zipafter choosing the fileabout 14 MB on the first visit. On later visits the pyodide… files come from the browser cache without a request to the server (the Size column says “cache”, in Chrome “(disk cache)”), and the server confirms worker.js and core.zip with a 304 “not modified” response carrying almost no data
Browser check (a small computing task)pow.js, challengeafter “Start analysis”a few KB
Session keysession?c=…&n=…after the browser has checked the fileunder 1 KB; in the response the server sets the geans_s cookie — a session number for 30 minutes
Knowledge base table of contentsmanifest.jsonright after the key (with the session cookie)about 1 MB
Knowledge base slice for your chip<chip model>.<code>.bin, e.g. 23andme_v5.….binafter the chip model is determined (with the session cookie)2–11 MB
Sometimes — the full sliceunknown.….binif the chip is not recognised or the file has markers (DNA positions the chip tests) outside the chip's usual setabout 11 MB
A service request about the completion of an analysis step: two parameters — the step and the result code; no file dataping?step=…&code=…after the file check, after the analysis and after the report is shown (or at the step where an error happened)nothing: a 204 response with no content; no cookie is attached

The session key request address (session?c=…&n=…) has two parameters: c is the task the server issued, n is the number your browser found while solving it. There is no data from the file in it; you can see this by opening the request (the Headers / Payload tabs).

The service request ping?step=…&code=… also has two parameters: step is the step (loaded — the file was checked, analyzed — the analysis finished, report — the report was shown) and code is how the step ended: ok or a short error name, for example e_net (“no connection”). The server accepts no other values. If the request does not get through, the analysis is not affected.

In the headers of the manifest.json and slice requests you will see the geans_s cookie — the session number, explained below in “What the server does learn”.

Diagram of the Network tab after an analysis A table of requests with the columns Name, Method, Status, Type, Size. Every row has the method GET; the Method column is highlighted (mark 1). Rows: the page, style.css, app.js, worker.js, the pyodide engine files (about 14 MB), core.zip, challenge, session, manifest.json (about 0.9 MB) and the 23andme_v5 knowledge base slice (3.3 MB); the last row is highlighted (mark 2): it is a download to you, not an upload. Elements Console Network Sources Filter NameMethodStatus TypeSize / (the page)GET200document4 kB style.cssGET200stylesheet7 kB app.jsGET200script29 kB worker.jsGET200script4 kB pyodide… (5 files)GET200script, wasm≈14 MB core.zipGET200fetch≈0.2 MB challengeGET200fetch<1 kB session?c=…&n=…GET200fetch<1 kB manifest.jsonGET200fetch≈0.9 MB 23andme_v5.….binGET200fetch3.3 MB All requests receive data (GET); some rows are omitted for brevity 1 2 1 Method: GET everywhere (receiving data). Sending the file would be POST or PUT. 2 The knowledge base slice for your chip (2–11 MB) is downloaded to you — not an upload.
Figure 2. What the list of requests looks like after an analysis. This is a diagram, not a screenshot: the tab looks different in different browsers and versions; sizes are approximate.
Diagram: the method:POST filter gives an empty list The Network tab filter box contains method:POST and is highlighted. The table of requests is empty: not a single request that sends data. This is how it should be. Elements Console Network Sources method:POST NameMethodStatus TypeSize The list is empty ✓ Not a single request that sends data — this is how it should be
Figure 3. The method:POST filter (Chrome, Edge, Firefox) shows only requests that send data. After an analysis in Geans the list is empty. This is a diagram, not a screenshot.

What must not be there

If you see any of these, please let us know: it is a bug and we want to know about it. Use the feedback form for this.

In addition: other sites are blocked

Together with the page, the server sends the browser a security rule (the Content-Security-Policy header). It forbids the page to load anything from, or connect to, any site other than Geans (connect-src 'self'), and to submit forms (form-action 'none'). The exception is the feedback form page: it may submit its form only to the Geans site (form-action 'self'). The browser itself enforces this rule. You can see it in the Network tab: click the first row (the page itself) → Headers → Response Headers.

The Network tab shows the requests of this page. Browser extensions run separately and are not covered by this check; if you are unsure about your extensions, open the page in a window without them (for example, a guest profile).

What the server does learn

The server does not receive the file contents, genotypes, the file name or the report. From the requests themselves it sees a little:

What goes into logs

Independent review

An independent audit is planned: an outside specialist will check that the file is not transferred, that the page does not contact other sites and that the server does not keep anything it should not. When the audit is done, a link to its report will appear here.

The audit scope is published: what exactly the auditor will check — which promises, by which methods, and how the auditor will make sure the server runs the same program that was reviewed.

The audit has not been carried out yet.